728x90
# 1. 클로저가 바로 실행되는 경우 -> retain cycle 없음.
lazy var 클로저가 곧바로 실행되는 경우, 컴파일러에 의해 클로저는 @nonescape 처리가 되어 self를 캡처하지 않는다.
즉, retain cycle이 발생하지 않는다.
예를 들어, 아래처럼 lazy var의 클로저가 곧바로 실행된다면 retain cycle이 증가하지 않고,. 변수에 nil이 설정되면 deinit이 호출된다.
# 2. 클로저 자체를 lazy var로 정의한 경우 -> retain cycle 발생할 수 있음.
클로저는 reference type이다.
클로저 자체를 lazy var로 정의하면, lazy var를 사용하는 곳에서 클로저 인스턴스를 lazy 하게 생성된다.
생성된 후 클로저 내부가 실행되므로 클로저는 @escaping이다.
즉, 클로저 내부에서 self를 capture 하기 때문에 retain cycle이 발생할 수 있다. -> retain count 증가함
이때 클로저에서 [unowned self]나 [weak self]를 사용하면 retain cycle을 방지할 수 있다.
# 참고
이번 글은 여기서 마무리.
반응형
'Swift' 카테고리의 다른 글
JSON을 enum associated value로 Decoding 하기 (1) | 2024.09.03 |
---|---|
map, compactMap, flatMap (0) | 2024.08.18 |
@propertywrapper (0) | 2024.06.07 |
protocol initializer가 클래스에서 required로 정의되어야 하는 이유 (0) | 2024.05.12 |
propertyWrapper로 UserDefaults 관리 (0) | 2024.05.11 |