@escaping:閉包的生命周期不在傳入的函數(shù)范圍內(nèi)管理,就是說這個(gè)閉包是被持有了。在函數(shù)return后,閉包并不會(huì)被銷毀,它被持有了。因?yàn)檫@個(gè)閉包要在異步請(qǐng)求回來后才執(zhí)行,這時(shí)候函數(shù)已經(jīng)return了,為了能執(zhí)行,必須被其他對(duì)象持有。如在網(wǎng)絡(luò)異步請(qǐng)求的時(shí)候,閉包一般是用@escaping修飾,因?yàn)榉庋b好的網(wǎng)絡(luò)請(qǐng)求,網(wǎng)絡(luò)請(qǐng)求成功后,閉包要在控制器中進(jìn)行回調(diào),所以要用@escaping修飾。
@non-escaping:閉包在函數(shù)內(nèi)執(zhí)行完后,函數(shù)才返回,閉包銷毀
總結(jié):看到函數(shù)的閉包參數(shù)被聲明為@escaping的時(shí)候,就要考慮self被循環(huán)引用的問題,要用unowned self或者weak self了;而如果是@non-escaping的話,就放心使用self吧,因?yàn)殚]包在函數(shù)內(nèi)執(zhí)行,會(huì)釋放被捕獲的self。