@noescaping
: 非逃逸闭包类型
@escaping
: 逃逸闭包类型
Swift 3.0 之后,传递闭包到函数中的时候,系统会默认为非逃逸闭包类(NonescapingClosures)@noescaping
,逃逸闭包在闭包前要添加@escaping
关键字。
闭包只有在函数中做参数时才会区分逃逸闭包和非逃逸闭包。
从生命周期看两者区别:
非逃逸闭包的生命周期与函数相同:
- 1,把闭包作为参数传给函数;
- 2,函数中调用闭包;
- 3,退出函数。结束
从生命周期看两者区别:
- 1,闭包作为参数传递给函数;
- 2,退出函数;
- 3,闭包被调用,闭包生命周期结束
//这是一个非逃逸闭包,闭包doBlock 在函数执行的时候就调用了
func methodName(block:(() -> Void)) {
block()
}
//这是一个逃逸闭包,闭包block 到了另一个作用域,跟当前函数是异步的,逃逸闭包必须用@escaping来修饰。因为默认是 @noescaping
func methodName(block:@escaping (() -> Void)) {
DispatchQueue.main.async {
block()
}
}