Escaping Closure=(逃逸閉包)
如果一個(gè)閉包被作為一個(gè)參數(shù)傳遞給一個(gè)函數(shù), 并且在函數(shù)return之后才被喚起執(zhí)行, 那么這個(gè)閉包是逃逸閉包。
【其實(shí)用oc時(shí)代普通的block作為回調(diào)的函數(shù)就是這樣的,每個(gè)block都是希望可以逃避閉包,誰(shuí)希望馬上執(zhí)行呀】
是個(gè)假參數(shù),可以不傳,調(diào)用者后面跟一個(gè){...}
不逃逸閉包的生命周期:
- Pass a closure into a function
- The function runs the closure (or not)
- The function returns
- then this closure die.
逃逸閉包的生命周期
- 跟不逃逸一樣
- 最后的生命周期是closure不會(huì)因?yàn)閒unction返回而被kill掉;
需要使用 escaping closure的兩種case:
- 異步execution
并不能說(shuō)函數(shù)return了就把closure kill掉, 因?yàn)檫@個(gè)closure可能還沒(méi)有執(zhí)行完畢 - 存儲(chǔ)
如果任何全局變量都有一些些存儲(chǔ)存在, 那么這個(gè)closure也被逃逸掉
插曲
在 Swift 1 和 2中, closure by default 是 escaping的, 所以我們需要用 @noescape 來(lái)mark;
在 Swift 3中, closure by default是non-escaping, 我們需要用@escaping 來(lái)mark;