簡體   English   中英

避免使用弱的自我保留閉合中的循環

[英]Avoid retain cycles in closures using weak self

我們正在就如何避免在封閉中保留周期的最佳方法進行辯論。 我們正在討論以下兩種方法。

    func getStock() { [weak self] (stock)in
       self?.dismissActivityIndicator()
    }

VS

    func getStock(){ [weak self] (stock) in
      guard let strongSelf = self else { return }
      strongSelf.dismissActicityIndicator()
    }

其中一個比另一個更好或更安全嗎? 為什么? 如果有幫助,我們的討論基於多線程方案。

實際上,兩種方法之間沒有區別。

可選的連鎖self?. 如果self nil ,則退出閉包,並guard let ... else {退出guard let ... else {

對於簡單的閉包(如您的單行示例),兩種方法之間確實沒有區別; 因此帶有弱引用的變體可以被認為是“更好的”,因為它更易於閱讀,占用的行數少(但最終還是要隨口味而變)。

當您的閉包變得復雜時,第二種方法更具確定性:例如,您可以在閉包內部調用另一個異步方法,並從嵌套的回調塊內部訪問strongSelf ,並確保該對象仍然存在。 如果self弱,則有可能在嵌套回調運行之前釋放對象。

強大的力量伴隨着巨大的責任。 強制使對象保持活動狀態並不總是您想要的-例如,當selfUIViewController ,可能希望將其保留在回調中只是一種期望的行為:如果將VC從視圖層次結構中刪除,則最好丟棄任何待處理的后台操作的結果,而不是更新永遠不會顯示的UI。 您甚至可以根據弱對象的存在來決定是否盡早取消后台工作。 (當然,除了示例之外,我不主張使用如此復雜的閉包。)

暫無
暫無

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

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