기존 오브젝트 C 에서의 메모리관리를 어떻게 해줬는지도 알고있어야한다.
왜 ARC가 나왔는지와 비교하면서 설명해주면 더욱 good!!
<aside> 💡 ARC 란? Automatic Reference Counting 자동 참조 카운팅
앱의 메모리 사용량을 추적하고 관리하기 위한 것으로 ARC는 인스턴스가 더이상 필요없을 때 클래스 인스턴스에 사용된 메모리를 자동적으로 해제한다.
RC(참조 카운팅)은 클래스의 인스턴스에만 적용됩니다. 구조체와 열거형은 값 타입이지 참조 타입이 아니며 참조를 저장 못하고 넘기지 못하기 때문..
</aside>
ARC가 메모리 영역 중 heap 영역을 관리하는 것. 힙에 메모리를 언제 할당한다? → 인스턴스 클로저 등 reference type은 자동으로 힙에 할당한다. 힙을 직접 건들이지 않아도 자동으로 할당하여 쓰고있던 것.
class Human {
var name: String?
var age: Int?
init(name: String?, age: Int?) {
self.name = name
self.age = age
}
}
let sodeul = Human(name: "Sodeul", age: 26)
위 예시에서 let sodeul은 클래스에서 생성된 지역변수라고 생각.. 이렇게 작성된 코드는 메모리에 아래처럼 저장이 된다.
지역 변수 sodeul은 stack에 할당되고, Human 인스턴스는 heap에 할당된다. stack에 있는 sodeul은 힙영역에 있는 인스턴스를 참조하고 있는 형태. 즉 sodeul안에는 힙에하당된 인스턴스의 주소값이 들어가 있다. 이렇게 참조하고 있기때문에
let clone = soduel
을 작성하면 인스턴스가 복사되지 않고 힙영역을 바라보고 참조하게된다.
이것이 Reference의 기본개념!
그러나 heap의 특징 중 하나는 사용하고 난 후 반드시 메모리 해제를 해줘야하는데 우리는 직접 메모리해제를 해준적은 없었다. 그럼 어떻게 메모리에서 해제해주냐??
이것을 ARC가 해제해준다.