[英]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
弱,則有可能在嵌套回調運行之前釋放對象。
強大的力量伴隨着巨大的責任。 強制使對象保持活動狀態並不總是您想要的-例如,當self
是UIViewController
,可能不希望將其保留在回調中只是一種期望的行為:如果將VC從視圖層次結構中刪除,則最好丟棄任何待處理的后台操作的結果,而不是更新永遠不會顯示的UI。 您甚至可以根據弱對象的存在來決定是否盡早取消后台工作。 (當然,除了示例之外,我不主張使用如此復雜的閉包。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.