在swift3.0之前,clouse默认时可以逃逸的。如果设置不可逃逸,使用@noescape修饰
在swift3.0之后,clouse默认时可以不逃逸的。如果设置可逃逸,使用@escaping修饰
-
@noescape的含义
@noescape在swift3.0中已经被废弃了,表示不可逃逸闭包
func requestAuthorization(@noescape completion: (Bool, Error?) -> Void){}
-
@escaping的含义
@noescape在swift3.0中新增修饰符,表示可逃逸闭包
func requestAuthorization(completion: @escaping (Bool, Error?) -> Void){}
**!注意修饰符位置不同**
- 什么是逃逸闭包(Escaping Closure)
如果一个闭包被作为一个参数传递给一个函数,并且在函数return之后才被唤起执行,那么这个闭包是逃逸闭包。并且这个闭包的参数是可以“逃出”这个函数体外的。
- 默认不可逃逸闭包的好处
最明显的好处就是编译器优化你的代码的性能和能力。如果编译器知道这个闭包是不可逃逸的,它可以关注内存管理的关键细节。 而且你可以在不可逃逸闭包里放心的使用self关键字,因为这个闭包总是在函数return之前执行,你不需要去使用一个弱引用去引用self.这对你而言是一个非常nice的功能。