[英]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.