swift

Strong, Weak, Unowned, 순환참조

motosw3600 2021. 12. 7. 15:53

Strong(강한 참조)

ARC의 개념에서 힙에 인스턴스가 할당될 때 RC(Reference Count)가 +1되는게 강한참조

별다른 선언이 없으면 default가 strong(강한 참조 객체)

Weak(약한 참조)

인스턴스 참조할 시 Reference Count값 증가하지 않음

참조 객체가 메모리에서 해제될 시 nil이 할당되어 메모리 해제

Unowned

인스턴스 참조할 시 Reference Count값 증가하지 않음

참조 객체가 메모리에서 해제될 시 nil을 할당 받지 못하고 해제된 메모리 주소 계속 가지고 있음

순환 참조란?

순환 참조란 두 객체가 서로가 서로를 참조하고 있는 형태

순환참조는 강한(strong) 순환 참조, 약한(weak) 순환 참조, unowned 순환 참조가 존재 합니다.

강한(strong) 순환 참조

강한 순환참조시 객체에 접근 가능한 연결을 끊었을때도 순환 참조로 인해 참조 카운트가 남아있어

momory leak(메모리 누수)가 발생 하는 참조입니다.

 

강한 순환 참조 예시)

 

순환참조 문제점

순환참조가 발생하는 인스턴스에 nil을 대입할 시 RC가 -1되서 0이 될 경우 메모리에서 해제가 되어야 하지만

순함참조는 deinit메서드가 호출되지 않음(계속 momory leak발생)

※ 순환참조 발생 시 약한 참조를 쓰면 해결 가능

약한참조란 순환 참조이지만 weak로 선언되어 RC 값을 올리지 않는 것

두 인스턴스가 서로를 참조할 때 약한 참조를 사용한 객체의 RC는 +되지 않으므로 두객체가 nil이 되었을 때

약한 참조의 객체는 RC가 +되지 않았기 때문에 0이 되므로 순환참조가 일어날 시 두 객체 모두 메모리에서 해제

# strong, weak, unowned 정리

 

'swift' 카테고리의 다른 글

Layout Update Method  (0) 2021.12.09
KVC, KVO  (0) 2021.12.08
Properties  (0) 2021.12.08
ARC(Auto Reference Count)  (0) 2021.12.07
Swift언어의 특징  (0) 2021.12.07