Delayed deinitialization - TIL49
class DestinationViewController: UIViewController {
private var vcValue: String = ""
override func viewDidLoad() {
super.viewDidLoad()
exampleFunction { str in
self.vcValue = str
print(self.vcValue)
}
}
func exampleFunction(completion: @escaping (String) -> Void) {
Task {
try await Task.sleep(for: .seconds(5))
completion("Delayed Deinitialization Test")
}
}
deinit {
print("DestinationVC deinit")
}
}
위와같은 상황에서는 example Function이 self를 참조하고, self는 example Function을 참조하는 상황이다.
순환참조가 발생하는데, 이때 ViewController가 dismiss된다고 해도 deinit은 바로호출되지 않는다.
여전히 클로저가 종료되지 않았기 떄문이다.
따라서 Task 5초뒤에 끝나고 escaping 함수까지 종료되어서야 비로서 viewcontroller는 dismiss된다.
댓글
