これは漏れない理由を説明できますか?スウィフト - 密閉状態で強く捉えた後のリークを期待してください
closure
の中にself
をキャプチャしているので、2つの強力なポインタが互いに指しているので、deinit
メッセージは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 ...
しかしそれは必要でもありませんでした。どうして?
「John Appleseed」の「Person」オブジェクトは依然として除外されます。私の答えを参照してください – Alexander
@AlexanderMomchliovクロージャがVC(自己)を保持し、VCが私の例のようにクロージャを保持する場合、VCは決して解放されません(クロージャもありません)。 VCが決して脱調しない場合、Personオブジェクトへの参照を解放することは決してありません。これは、Personオブジェクトが決してdeinitしないことを意味します。 –
保持サイクルがあるかどうかは関係ありません。 'john'は明示的に' nil'に設定され、最後の参照を削除します。これにより、ARCは 'deinit'を行います。 – Alexander