我正在阅读文档(“自动引用计数”章节“闭包的强引用循环”),但我似乎无法弄清楚在定义类时应该保持对 self 的强引用的情况(该类的实例)在一个属性的闭包中。
捕获列表似乎总是避免内存泄漏的最佳解决方案,我真的想不出任何应该保持强引用循环的场景。

以下是文档提供的示例:

class HTMLElement {

    let name: String
    let text: String?

    // Without Capture List
    @lazy var asHTML: () -> String = {
        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 {
        println("\(name) is being deinitialized")
    }

}
class HTMLElement {

    let name: String
    let text: String?

    // With Capture List
    @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 {
        println("\(name) is being deinitialized")
    }

}

最佳答案

如果您要创建一个由生命周期可能与 self 不匹配的对象或函数执行的闭包,则需要保持对 self 的强引用。

例如:

class A {
    func do() {
        dispatch_async(dispatch_get_global_queue(0, 0)) {
            println("I printed \(self) some time in the future.")
        }
    }
}

var a : A? = A()
a.do()
a = nil // <<<

在箭头处,主函数体将释放对新创建的 A 实例的最后一个引用,但调度队列需要保持它直到闭包执行完成。

关于swift - Swift 中闭包的强引用循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24080547/

10-17 01:08