有人可以帮助解释为什么obj2会被去掉吗? (我认为有一个保留周期) obj2和obj1是如此相似: 它们都有一个名为printNameLength的属性,它们都是一个闭包,它都捕获自己(或者它是?). 但obj2得到
obj2和obj1是如此相似:
它们都有一个名为printNameLength的属性,它们都是一个闭包,它都捕获自己(或者它是?).
但obj2得到了deinit(而obj1并不是因为有一个保留周期),它让我感到惊讶,我无法弄清楚为什么.
非常感谢.
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在第二种情况下,最初会有一个保留周期,但是当您将变量obj2设置为nil时它会被破坏.
在Swift中,闭包通过引用捕获变量(就像在被捕获的变量被声明为__block时在Objective-C中发生的那样),而不是值,因此闭包之外的变量的赋值反映在闭包中(反之亦然).闭包只通过引用捕获的obj2变量间接地引用了myClass2实例;通过将obj2设置为nil,你打破了它.