2017-10-07 3 views
4

誰かが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 
+2

比較https://stackoverflow.com/q/40978533/2976878 – Hamish

答えて

0

、そこに保持サイクルは最初ですが、nilに変数obj2を設定したときに、それが壊れています。

Swiftでは、値ではなく、キャプチャされた変数が宣言されたときにObjective-Cで起こるように、参照によってキャプチャ変数を閉じます。したがって、closure外の変数への代入はclosureに反映されます。 。クロージャは、myClass2インスタンスへの参照を間接的に参照するだけで、参照によってキャプチャされたobj2変数を使用していました。 obj2nilに設定すると、あなたはそれを壊しました。

関連する問題