기존 오브젝트 C 에서의 메모리관리를 어떻게 해줬는지도 알고있어야한다.

왜 ARC가 나왔는지와 비교하면서 설명해주면 더욱 good!!

Documentation

<aside> 💡 ARC 란? Automatic Reference Counting 자동 참조 카운팅

앱의 메모리 사용량을 추적하고 관리하기 위한 것으로 ARC는 인스턴스가 더이상 필요없을 때 클래스 인스턴스에 사용된 메모리를 자동적으로 해제한다.

RC(참조 카운팅)은 클래스의 인스턴스에만 적용됩니다. 구조체와 열거형은 값 타입이지 참조 타입이 아니며 참조를 저장 못하고 넘기지 못하기 때문..

</aside>

참조 타입(Reference Type)과 Heap

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은 클래스에서 생성된 지역변수라고 생각.. 이렇게 작성된 코드는 메모리에 아래처럼 저장이 된다.

스크린샷 2023-07-28 11.34.47.png

지역 변수 sodeul은 stack에 할당되고, Human 인스턴스는 heap에 할당된다. stack에 있는 sodeul은 힙영역에 있는 인스턴스를 참조하고 있는 형태. 즉 sodeul안에는 힙에하당된 인스턴스의 주소값이 들어가 있다. 이렇게 참조하고 있기때문에

let clone = soduel

을 작성하면 인스턴스가 복사되지 않고 힙영역을 바라보고 참조하게된다.

스크린샷 2023-07-28 11.37.20.png

이것이 Reference의 기본개념!

그러나 heap의 특징 중 하나는 사용하고 난 후 반드시 메모리 해제를 해줘야하는데 우리는 직접 메모리해제를 해준적은 없었다. 그럼 어떻게 메모리에서 해제해주냐??

스크린샷 2023-07-28 11.38.37.png

이것을 ARC가 해제해준다.