繁体   English   中英

快速保留周期缺少澄清

[英]Swift retain cycle missing clarification

Apple有描述保留循环如何在闭包中工作的文档 这是他们的闭合示例,不会引起保留周期。

class HTMLElement {

    let name: String
    let text: String?

    lazy var asHTML: () -> String = {
        [unowned self] in
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) is being deinitialized")
    }

}

我有时喜欢将函数定义传递给回调,以尝试摆脱回调地狱的代码。

这个例子有些人为,但这会导致保留周期吗? 将这样的函数分配给闭包是否会导致保留周期?

class HTMLElement {

    let name: String
    let text: String?

    lazy var asHTML: () -> String = self.returnHTML

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    func returnHTML() -> String {
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    deinit {
        print("\(name) is being deinitialized")
    }

}

实际上,您的示例不够人为。 让我们简化一下:

class C {
    lazy var f: () -> () = {
        [unowned self] in
        print(self)
    }
    init() {}
    func doF() {
        self.f()
    }
    deinit {
        print("C is being deinitialized")
    }
}

现在让我们测试一下:

    let c = C()
    c.doF()

结果:当c超出范围时,我们看到“ C正在被初始化”。

好的,但是现在删除中的[unowned self] in 现在,当我们对其进行测试时,我们不到“ C正在被初始化”。 我们有一个保留周期。

所以是的,您具有self保留功能,该功能指向self ,这是一个保留周期。 你是正确的利用unowned self打破循环的方式。

(当然,在我的示例中,我考虑的是您的lazy使图片复杂化的方式。如果我们不说self.f() ,也就是说,如果我们从不要求lazy var初始化自身,则当然, f的初始化程序是什么无关紧要:它永远不会被初始化,因此不会有保留周期,但这是一个极不可能的情况;如果您永远不会初始化lazy var那么您就不会拥有lazy var 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM