@escaping:闭包的生命周期不在传入的函数范围内管理,就是说这个闭包是被持有了。在函数return后,闭包并不会被销毁,它被持有了。因为这个闭包要在异步请求回来后才执行,这时候函数已经return了,为了能执行,必须被其他对象持有。如在网络异步请求的时候,闭包一般是用@escaping修饰,因为封装好的网络请求,网络请求成功后,闭包要在控制器中进行回调,所以要用@escaping修饰。
@non-escaping:闭包在函数内执行完后,函数才返回,闭包销毁
总结:看到函数的闭包参数被声明为@escaping的时候,就要考虑self被循环引用的问题,要用unowned self或者weak self了;而如果是@non-escaping的话,就放心使用self吧,因为闭包在函数内执行,会释放被捕获的self。