어떤 앱을 실행했다고 가정했을 때, 그 앱은 아이폰 메모리의 일부를 앱의 메모리로 사용할 것이다.
그리고 그 프로젝트의 ViewController 내부에 myLabel이 있다면, 이들 각각은 해당 앱 메모리의 일부를 사용할 것이다.
즉 클래스 등의 인스턴스를 생성할 때마다 앱 메모리의 일부를 사용한다는 것은 굉장히 기본적인 내용이다.
그렇다면 메모리 문제에는 어떤 것들이 있을까?
1. 앱이 휴대폰의 메모리를 너무 많이 차지하게 되는 경우
이렇게 되면 앱의 성능이 저하되거나 충돌하는 등의 예기치 않은 일이 발생할 수 있다.
2. 메모리에 추가한 데이터가 제거되지 않았을 경우
이것을 메모리 누수 현상이라고 한다.
이렇게 추가는 됐지만 제거되지 않고 남아있는 객체가 메모리에 계속 누적되는 것도 중요한 메모리 문제 중 하나이다.
3. 메모리에 추가한 데이터가 예기치 않게 메모리에서 제거되는 경우
이 때는 다시 참조하거나 값을 얻으려고 해도 메모리에 더 이상 존재하지 않기 때문에 앱이 충돌하게 된다.
위 3가지 상황은 메모리 관련 문제의 대표적인 경우일 뿐, 메모리와 관련해 발생할 수 있는 문제의 전부가 아니다.
Swift의 메모리라는 주제에 대해 더 깊게 이해하기 위해서는 Swift의 2가지 유형(밸류타입, 레퍼런스타입)과, 이것들이 메모리와 어떻게 관련되는지부터 알아야 한다.
밸류타입(값 타입)과 레퍼런스타입(참조 타입)은 메모리 내에서 존재하는 방법부터가 서로 다르다.
인스턴스가 데이터의 고유한 복사본을 유지
(ex: String, Int, Struct, enum, Bool, Array, Dictionary)
값 타입은 가지고 있는 데이터를 계속 유지하며, 다른 곳에서 사용하는 경우에는 해당 값의 복사본을 만들어낸다.
인스턴스가 데이터의 단일 복사본을 공유
(ex: Class)
참조 타입은 객체의 단일 인스턴스이다.
다른 곳에서 사용하는 경우 복사본은 하나만 존재할 뿐이고, 그(클래스의) 단일 복사본에 대한 포인터 또는 참조를 다시 전달한다.