簡體   English   中英

封閉的強大參考周期?

[英]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函數都將受到此問題的影響-顯然並非如此。 weakunowned自我發揮作用的地方是匿名函數-就像我之前說的那樣,只有該匿名函數本身也被self保留。]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM