簡體   English   中英

將閉包作為參數傳遞給單例時的Swift內存管理

[英]Swift Memory management when pass a closure as parameter to singleton

我知道以下事實:如果將closure分配給一個類的屬性,並且該類的實例屬性在閉包內部使用,則它可以創建retain cycles

1) 關閉沒有分配給class屬性,而是作為參數傳遞給單例的class方法呢?

2) 在這種情況下如何管理內存?

在我的控制器(UIViewController)的方法中,我有類似以下內容:

MySingleton.classMethod(parameters ..., completion: { () -> Void in
   /**
   doing stuff here
   */
})

如果您不是將閉包分配給屬性,而只是將其傳遞給函數,則需要考慮閉包是轉義還是轉義。 在Swift 3中,默認情況下,傳遞給函數的所有閉包都是非轉義的。

以下是有關此問題的更多信息:

“ noescape”-在函數返回之前調用傳遞的閉包

“轉義”-如果將閉包作為參數傳遞給函數,並且在函數返回后調用該閉包,則閉包正在轉義。

簡單說明:當我們將閉包傳遞給函數時,需要將閉包標記為轉義,並且在此函數返回后將調用閉包。

一般規則是閉包轉義時,您需要使用捕獲列表來防止保留周期。

let closure = { [weak someVariable] (name: Type) -> Void in
....
// code
}

附加信息:

一件奇怪的事情是,可選的閉包被視為轉義。 當我們顯式添加轉義關鍵字時,會出現編譯錯誤-轉義屬性僅適用於函數類型。

有關更多信息,請參見以下鏈接。

https://bugs.swift.org/browse/SR-2053

https://stackoverflow.com/a/39619298/5388473

https://stackoverflow.com/a/39846519/5388473

更新
在轉義閉包的捕獲列表中使用弱或未擁有的想法是,基本上我們不知道所傳遞的轉義閉包會發生什么,它可能稍后會從另一個函數中調用,或者可能存儲在某個對象中,可能會導致強大的保留周期。

弱者vs無人者vs強勢捕獲

有關更多詳細信息,請查看Apple ARC文檔

從蘋果文檔:

使用類類型的屬性時,Swift提供了兩種解決強引用周期的方法:弱引用和無主引用。

弱引用和無主引用使引用周期中的一個實例可以引用另一個實例,而無需對其進行嚴格控制。 然后,這些實例可以相互引用,而無需創建強大的引用周期。

當另一個實例的生存期較短時(即,另一個實例可以首先被釋放時),請使用弱引用。 當另一個實例具有相同的生存期或更長的生存期時,請使用無主引用。

請記住,弱方法將在代碼中添加樣板,並且速度會稍慢一些,因為ARC將添加用於將弱變量設置為零的代碼。 當選擇弱者或無人者時,遵循上述規則是一個好習慣。

暫無
暫無

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

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