これが漏れない理由を誰か説明してもらえますか?
self
内でキャプチャしているclosure
ため、2 つの強力なポインターが互いに指し合っているdeinit
ため、Person オブジェクトに対してメッセージが呼び出されることはありません。
まず、これは私のクラスPersonです:
class Person {
var name: String
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
そして、これは私のViewControllerの実装です:
class ViewController: UIViewController {
var john:Person?
func callClosureFunction( closure:(name:Bool) -> () ) {
closure(name: true)
}
override func viewDidLoad() {
super.viewDidLoad()
john = Person(name:"John")
self.callClosureFunction { (name) in
self.john?.name = "John Appleseed"
self.john = nil
// xcode prints - John Appleseed is being deinitialized
}
}
}
次のようにして問題を解決できると期待していました。
self.callClosureFunction { [weak self] (name) in ...
しかし、それは必要でもありませんでした。なんで?