Official Document:
ARC. Automatic Reference Counting. ARC는 class의 인스턴스가 할당될 때부터 메모리 상태를 추적한다. (struct, enum은 해당하지 않는다.) class 내의 property, constant, variables가 더 이상 사용되지 않을 때 메모리를 해제하게 된다. 평상시에는 별다른 조취를 취하지 않아도 메모리를 해제하게 되지만, 두 개 이상의 인스턴스가 서로를 참조하고 있을 경우(strong reference cycle) 메모리 해제 대상이 아니다.
상호 참조를 해야하는 경우가 발생한다면 weak이나 unowned 키워드를 사용해서 strong reference cycle을 방지할 수 있다.
- weak는 객체 A보다 참조되는 객체 B가 더 오래 남아있어야 할 필요가 없을 때 사용한다.
- unowned는 객체 A보다 참조되는 객체 B가 더 오래 남아있거나 동시에 해제될 때 사용한다.
따라서 strong reference cycle이 예상되는 property는 선언할 때 앞에 weak이나 unowned를 명시하는 것이 좋다. unowned는 nil이 없을 것이라고 가정하기 때문에 optional 타입을 지원하지 않는다. nil일 수 있는 인스턴스에는 weak을 쓰고 nil일 수 없는 인스턴스에는 unowned를 쓴다.
*unowned(unsafe) 라는 키워드도 있지만, Cocoa class의 import wrapper에서나 볼 수 있을 것이고 쓰지 않는 것이 좋다.
closure도 reference type이기 때문에 ARC가 메모리 상태를 추적하게 된다. closure는 instance method가 아니라서 input type과 return type이 같다면 재정의가 가능한데, 이럴 때 다른 reference type을 참조할 경우가 생긴다. 이 때도 unowned나 weak를 쓰면 되고, 자기 자신의 property에 접근하게 될 경우 unowned self를 쓰면 좋다. closure 내에 unowned나 weak를 정의하는 것을 capture list라고 한다.
'Programming > iOS' 카테고리의 다른 글
Apple Login (Sign In With Apple) 구현하기 (0) | 2020.02.23 |
---|