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