加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:27:27 所属栏目:百科 来源:网络整理
导读:有人可以帮助解释为什么obj2会被去掉吗? (我认为有一个保留周期) obj2和obj1是如此相似: ?它们都有一个名为printNameLength的属性,它们都是一个闭包,它都捕获自己(或者它是?). 但obj2得到了deinit(而obj1并不是因为有一个保留周期),它让我感到惊讶,我无法
有人可以帮助解释为什么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,你打破了它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读