[英]Strong Reference Cycles for Closures?
像以下示例一樣,Swift Closure在引用self時將具有強大的引用周期:
class Test {
var name = "Hello"
func doSomething() {
{() -> Void in
self.name = "otherName"
}()
}
}
在前面的示例中,我創建了一個強大的參考周期,因此必須使用以下方法進行修復:
class Test {
var name = "Hello"
func doSomething() {
{[unowned self] () -> Void in
self.name = "otherName"
}()
}
}
問題:如果我在封閉中引用自我,是否必須始終使用unowned self
或者在某些情況下必須使用weak self
?
如果我在封閉中引用自我,是否必須使用永遠無人的自我,或者在某些情況下必須使用弱自我?
都不行 在大多數情況下,通常只是指稱self
而對其內存管理不做任何事情。 如果存在保留周期的危險,則只需要擔心內存管理,除非將閉包存儲在某個位置(例如self的屬性),否則就沒有這種危險。
您可以通過添加deinit
實現輕松地證明這一點:
class Test {
var name = "Hello"
func doSomething() {
{() -> Void in
self.name = "otherName"
}()
}
deinit {
println("bye")
}
}
現在創建一個Test實例並立即釋放它:
func testTest () {
let t = Test()
}
您會在控制台中看到“再見”,證明實例已按良好順序釋放。 此代碼中從來沒有任何類型的“強參考周期”。 您的擔憂是毫無根據的。
[順便說一句,您使用的“關閉”一詞是錯誤的。 每個 Swift函數都是一個閉包。 如果僅由於在閉包中使用了self
一詞而導致出現保留周期問題,則每個 Swift函數都將受到此問題的影響-顯然並非如此。 weak
和unowned
自我發揮作用的地方是匿名函數-就像我之前說的那樣,只有該匿名函數本身也被self
保留。]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.