@escaping與@non-escaping聲明用來修飾閉包的
@escaping:閉包的生命周期不在傳入的函數范圍內管理,就是說這個閉包是被持有了,比如
Paste_Image.png
在函數return后,閉包并不會被銷毀,它被持有了。因為這個閉包要在異步請求回來后才執行,這時候函數已經return了,為了能執行,必須被其他對象持有
@non-escaping:閉包在函數內執行完后,函數才返回,閉包銷毀,這樣一來,閉包的內存管理就非常清晰了
Paste_Image.png
總結:看到函數的閉包參數被聲明為@escaping的時候,就要考慮self被循環引用的問題,要用unowned self或者weak self了;而如果是@non-escaping的話,就放心使用self吧,因為閉包在函數內執行,會釋放被捕獲的self。