Swift 3.0 @escaping与@non-escaping区别

@escaping与@non-escaping声明用来修饰闭包的

@escaping:闭包的生命周期不在传入的函数范围内管理,就是说这个闭包是被持有了,比如

Paste_Image.png

在函数return后,闭包并不会被销毁,它被持有了。因为这个闭包要在异步请求回来后才执行,这时候函数已经return了,为了能执行,必须被其他对象持有

@non-escaping:闭包在函数内执行完后,函数才返回,闭包销毁,这样一来,闭包的内存管理就非常清晰了

Paste_Image.png

总结:看到函数的闭包参数被声明为@escaping的时候,就要考虑self被循环引用的问题,要用unowned self或者weak self了;而如果是@non-escaping的话,就放心使用self吧,因为闭包在函数内执行,会释放被捕获的self。

推荐阅读更多精彩内容