iOS相關(guān) | swift 閉包

一、閉包分為:
1.逃逸閉包(Escaping Closures)
2.非逃逸閉包(Nonescaping Closures)
在swift 3.0中,傳遞閉包到函數(shù)中的時候,系統(tǒng)會默認(rèn)為非逃逸閉包類型

二、非逃逸閉包
非逃逸閉包的生命周期比較簡單:
1.把閉包作為參數(shù)傳遞給函數(shù)。
2.函數(shù)中運行該閉包。
3.退出函數(shù)。

非逃逸閉包
顯而易見是非逃逸閉包被限制在函數(shù)內(nèi),當(dāng)函數(shù)退出的時候,該閉包引用計數(shù)不會增加,也就是說其引用計數(shù)在進(jìn)入函數(shù)和退出函數(shù)時保持不變。

三、逃逸閉包
逃逸閉包恰恰與非逃逸閉包相反,其生命周期長于相關(guān)函數(shù),當(dāng)函數(shù)退出的時候,逃逸閉包的引用仍然被其他對象持有,不會在相關(guān)函數(shù)結(jié)束后釋放。

Swift 3.x中, 閉包參數(shù)默認(rèn)是非逃逸類型,如果需要其逃逸類型的閉包,記得使用關(guān)鍵字 @escaping

而對于非逃逸型閉包,由于其生命周期確定短于相關(guān)函數(shù),編譯器可以據(jù)此做性能優(yōu)化。

注意

要謹(jǐn)慎使用@escaping(逃逸閉包),除非明確知道要使用它做什么。

下面是使用逃逸閉包的2個場景:
異步調(diào)用: 如果需要調(diào)度隊列中異步調(diào)用閉包, 這個隊列會持有閉包的引用,至于什么時候調(diào)用閉包,或閉包什么時候運行結(jié)束都是不可預(yù)知的。
存儲: 需要存儲閉包作為屬性,全局變量或其他類型做稍后使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容