我正在阅读文档(“自动引用计数”章节“闭包的强引用循环”),但我似乎无法弄清楚在定义类时应该保持对 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/