如果闭合会导致强参考周期,则需要使用[weak self]或[unowned self]。
此,如果你分配封盖的自我的属性,可能会发生,你指的自我或自内盖子本身的属性。闭包是引用类型,因此基本上相同的规则适用于强引用,如同使用普通类一样。
至于你的例子,不需要[weak self]
或[unowned self]
,因为你没有把闭包分配给self
引用的类中的变量,所以不会有强的参考周期。
有关更多信息,请查阅Swift编程语言指南的Strong Reference Cycles for Closures部分。下面是从当强参考周期可以通过闭合而引起的所提到的链接的示例:
class HTMLElement {
let name: String
let text: String?
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 {
print("\(name) is being deinitialized")
}
}
没有[unowned self]
在asHTML
封闭,强大的参考周期将通过分配给asHTML
封闭引起的。将asHTML
更改为以下解决方案可解决此问题:
lazy var asHTML:() -> String = {
[unowned self] in
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}
在任何情况下,**没有提及**何时使用**的答案**? –
另请参阅[强封闭循环参考](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097 -CH20-ID56)Swift编程语言指南的一部分。 –