closure_자신 인스턴스 참조_weak_ in swift(2회독)

hankyulee·2021년 9월 22일
0

closure

목록 보기
3/7

클로저는 캡쳐한다 -> Closure는 값을 캡쳐할 때 value/reference 타입에 관계 없이 Reference Capture 한다. == strong으로 캡쳐한다 -> reference count 증가 -> (아래코드) cat 인스턴스를 할당할 때 이미 count가 올라간 상황 -> self 를 참조하는 closure을 실행한 후 cat1 = nil 해도 deinit 되지않는다 -> 메모리에서 해지 되지않음(강한 순환 참조 발생).

hacking with swift에서 좋은표현이 있다: Strong capturing
Unless you ask for something special, Swift uses strong capturing. This means the closure will capture any external values that are used inside the closure, and make sure they never get destroyed.


catfavorite을 호출하지 않으면 deinit이 된다. lazy가 아니면 self를 참조할 수 없다.

강한참조를 벗어나보자..

[weak self]를 이용!
성공!

<추가>

정리: 자신의 클래스에서 클로저내에 자신을 참조할때, 인스턴스의 속성이 클로저의 강력 참조를 유지한다. 클로저 내에서 self를 참조하기 떄문에 클로저는 self에 강력참조. => 강력 참조 순환은 둘 사이 간에 만들어진다. 즉 인스턴스와 클로저 사이의 강력 참조 순환. 인스턴스는 클로저를 참조하고 클로저는 자신을 참조하기때문. 따라서 클로저와 인스턴스간의 강한 참조 순환이므로 두가지 모두 없애줘야 메모리에서 해제된다. 클로저와 클래스 모두 래퍼런스 타입이다. 그래서 강한 래퍼런스 사이클이 발생할 수 있다. 클래스에서 클로저를 프로퍼티에 할당하면 클로저를 참조하는것이다.

상식: 캡쳐리스트는 value 타입 값을 클로저 내부에서 사용할 때 사용하곤 한다.

다음사진은 클로저내부에서 self를 참조하여 인스턴스 == nil 해도 deinit 되지 않아, closure 와 인스턴스 둘다 제거하여 deinit하는 모습이다.

참고:
hacking with.swift.
http://minsone.github.io/mac/ios/swift-automatic-reference-counting-summary

0개의 댓글