Swift: @escaping 和 @noescaping 是什么? 有什么作用?

@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()
    }
}

非逃逸闭包在闭包里调用对象的时候,是不用写self的

你可能感兴趣的:(Swift: @escaping 和 @noescaping 是什么? 有什么作用?)