一、閉包分為:
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ù)知的。
存儲: 需要存儲閉包作為屬性,全局變量或其他類型做稍后使用。