swift - Swift 中闭包的强引用循环

标签 swift

我正在浏览文档(关于“自动引用计数”的章节“闭包的强引用循环”部分),但我似乎无法弄清楚在定义类时我应该保留强引用的情况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/

相关文章:

c - 如何快速捕获无效的枚举

swift - “The compiler is unable to type-check this expression in reasonable time”提供一个简单的公式

iOS Google map 以编程方式选择注释 [Swift]

swift - COCOA - 当在 NSTextfield 中达到最大长度时,如何使文本字段不允许文本输入?

ios - 当 CollectionView 被触摸时禁用动画?

ios - UiLabel 识别 TableViewCell Swift 中的 URL

ios - prepareForSegue 什么时候被调用?

串行队列中的 iOS 网络请求

swift - 编码结构并转换为字典 [String : Any]

ios - UIImagePickerController 仅在 iPhone/iPad 应用程序中从横向相册中选择