如果閉合會導致強參考週期,則需要使用[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編程語言指南的一部分。 –