Sign In
한결
Status
Empty
Assignee
Empty
Automatic Reference Count (ARC)
iOS 앱에서 메모리의 힙 영역을 관리하는 프로세스 (참조하고 있는 것의 갯수를 관리하는 방식)
힙 영역에는 참조되어 관리하는 요소들이 코드 영역에서 올라온다. (대표적인 참조형은 클래스의 인스턴스나 클로저가 될 수 있겠다.)
힙 영역에 참조할 것이 생성되면 RC를 증가시키고, 해당 인스턴스의 변수나 참조형이 더 이상 역할을 하지 않는다면 RC를 감소시키고 자체적으로 메모리에서 해제시킨다.
컴파일 타임에 RC에 대한 관리가 된다는 점이 주요점이다. (런타임단에서 관리되는 가비지 컬렉터와 차이가 있다.)
강한 참조
class Person { var name: String init(name: String) { self.name = name print("Person init") } deinit { print("Person deinit") } } var a: Person? = Person(name: "a") // RC + 1 var b = a // RC + 1 a = nil // RC - 1 => RC가 0이 되지 않았음.
위 코드에서 변수 a에 nil을 재할당해도 Person의 인스턴스는 deinit을 하지 않는다. 이건, 변수 b가 a에 담겼던 Person의 인스턴스를 강하게 참조하고 있기 때문이다.
Person 인스턴스를 deinit하려면 b = nil 로 RC를 다 감소시키고, 참조하고 있는 요소를 다 없애줘야 한다. (강함 참조의 경우)
약한 참조
var a: Person? = Person(name: "a") weak var b = a // RC 증가 없음 a = nil // "Person deinit"
weak 키워드로 다른 인스턴스를 참조시키는 경우, 참조 시점에 RC를 증가시키지 않는다.
참조하는 인스턴스가 해제될 경우, 주소값 자체를 지운다.
weak로 선언한 변수의 경우 컴파일 타임에서 nil이 할당될 수 있기 때문에,
- 반드시
변수로(var 키워드) 선언해야 하고(재할당이 될 수 있도록)
- 타입을
옵셔널로 정의해줘야 한다.
weak로 선언한 참조 관계는 참조가 해제되는 순서가 중요할 수 있다.
특정 하나의 클래스 멤버만 다른 참조 타입을 weak로 바라볼 경우 deinit 되는 시점을 잘 체크해야 한다.
unowned 키워드 역시 weak 키워드와 같이 다른 참조형을 참조하는 경우, RC를 증가시키지 않는다.
참조하는 인스턴스가 해제될 경우, 주소값 지우지 않고 남긴다.
👍