swift – 我的myClass2中没有保留周期吗?

swift – 我的myClass2中没有保留周期吗?,第1张

概述有人可以帮助解释为什么obj2会被去掉吗? (我认为有一个保留周期) obj2和obj1是如此相似:  它们都有一个名为printNameLength的属性,它们都是一个闭包,它都捕获自己(或者它是?). 但obj2得到了deinit(而obj1并不是因为有一个保留周期),它让我感到惊讶,我无法弄清楚为什么. 非常感谢. class myClass1 { var name: String 有人可以帮助解释为什么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 deinitclass 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,你打破了它.

总结

以上是内存溢出为你收集整理的swift – 我的myClass2中没有保留周期吗?全部内容,希望文章能够帮你解决swift – 我的myClass2中没有保留周期吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/999816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存