홍로그

메모리 순환 참조 방식 ( Strong, Weak, Unowned ) 본문

iOS

메모리 순환 참조 방식 ( Strong, Weak, Unowned )

성홍민 2021. 4. 18. 19:35

ARC가 메모리를 참조하는 방법

Strong reference

strong은 어떠한 설정도 없을 때의 디폴트 값이다.

해당 인스턴스의 소유권을 가진다.

reference count를 증가시킨다.

클로저 캡처링 이나 객체 간 서로 참조 등의 경우 reference count가 0이 되지 않는 상황이 있을 수 있고,

이럴 때 메모리 누수 (Memory Leak)가 발생할 수 있다.

 

Weak reference

weak은 해당 인스턴스의 소유권을 가지지 않는다.

reference count를 증가시키지 않는다.

weak은 객체가 Optional이라 해당 객체가 해제되어 버린 상태에서 참조하게 되면 Application이 강제 종료 되는 상황이 생긴다.

대신 언래핑 하는 과정을 통해 안전하게 사용할 수 있다. 

객체 참조형 변수에 nil이 할당될 수 있어야 한다.

weak은 객체를 계속 추적하면서 객체가 사라지게 되면 nil로 바꾼다.

대표적인 예로 delegate 패턴에서 retain cycle이 발생하는데 이로 인한 메모리 누수를 막기위해 weak을 사용한다.

 

Unowned reference

unowned는 해당 인스턴스의 소유권을 가지지 않는다.

reference count를 증가시키지 않는다.

Optional 객체가 아니기 때문에 nil일 수 없다.

weak은 객체를 계속 추적하고 있어 런타임시 오버헤드가 증가할 수 있기 때문에 확실한 객체에서는 unowned를 사용하여 오버헤드를 줄이고 나머지는 weak을 사용하는 것이 좋다.

반응형

'iOS' 카테고리의 다른 글

Swift final을 쓰는 이유  (0) 2022.11.01
UIWebView, WKWebView, SFSafariView 차이  (2) 2022.10.25
iOS ARC (Automatic Reference Counting)  (0) 2021.04.18
UIViewController LifeCycle  (0) 2021.01.28
구조체와 클래스의 차이  (6) 2021.01.20