誰かがobj2がdeinitを取得する理由を説明するのに役立つことができますか? (保持サイクルがあると思います)myClass2に保持サイクルはありませんか?
obj2とobj1は似ています: 両方ともclosureであり、両方ともself(またはそれ?)という名前のプロパティを持ちます。
しかし、obj2はdeinitを取得しますが(obj1は保持サイクルがあるためではありませんが)、それは私を驚かせ、私はなぜそれを理解できません。
ありがとうございます。第2のケースで
class myClass1 {
var name: String
lazy var printNameLength: (() -> Int) = { // [unowned self]
return self.name.characters.count // retain cycle here
}
init(name: String){
self.name = name
}
deinit {
print("deinit myClass1: \(name)")
}
}
var obj1: myClass1? = myClass1.init(name: "obj1")
print(obj1!.printNameLength())
obj1 = nil // never get deinit
class myClass2{
var name: String
init(name: String){
self.name = name
}
var printNameLength: (() -> Int)?
deinit {
print("deinit myClass2: \(name)")
}
}
var obj2: myClass2? = myClass2.init(name: "obj2")
obj2!.printNameLength = {
return obj2!.name.characters.count // no retain cycle here?
}
print(obj2!.printNameLength!())
obj2 = nil // get deinit
比較https://stackoverflow.com/q/40978533/2976878 – Hamish