Swift之逃逸闭包和非逃逸闭包

逃逸:一个函数的闭包可能会在该函数返回后被调用,闭包逃脱出了接收它作为参数的函数的作用域。

非逃逸闭包是不可能产生循环强引用的闭包,不需要显式引用self,所以可以隐式地调用self的属性和方法。

以函数参数形式声明的闭包默认是非逃逸的;其他场景中的闭包是逃逸的。

如果把闭包保存到属性中,意味着可以在函数返回后调用它,也就是说闭包会逃脱出函数的作用域:

1
2
3
func userNetWorthChangeHandler(handler: (Double) - > Void){
account.netWorthChangedHandler = handler//这时候编译器会报错
}

需要将传递的闭包参数用@escaping标记为逃逸闭包:

1
2
3
func userNetWorthChangeHandler(handler: @escaping (Double) - > Void){
account.netWorthChangedHandler = handler//这时候编译器会报错
}