本文主要分析逃逸闭包 、非逃逸闭包、自动闭包
逃逸闭包 & 非逃逸闭包
逃逸闭包定义
当闭包作为一个实际参数传递给一个函数
时,并且是在函数返回之后调用
,我们就说这个闭包逃逸了。当声明一个接受闭包作为形式参数的函数时,可以在形式参数前写@escaping
来明确闭包是允许逃逸
的
-
如果
用@escaping
修饰闭包后,我们必须显示的在闭包中使用self
-
swift3.0之后,系统默认闭包参数就是被
@nonescaping
,可以通过SIL来验证-
1、执行时机:在函数体内执行
-
2、闭包生命周期:函数执行完之后,闭包也就消失了
-
逃逸闭包的两种调用情况
-
1、延迟调用
-
2、作为属性存储,在后面进行调用
1、作为属性
当闭包作为存储属性
时,主要有以下几点说明:
-
1、
定义
一个闭包属性
-
2、在
方法中对闭包属性进行赋值
-
3、在
合适的时机调用
(与业务逻辑相关)
如下所示,当前的complitionHandler
作为CJLTeacher
的属性,是在方法makeIncrementer
调用完成后才会调用,这时,闭包的生命周期要比当前方法的生命周期长
//*********1、闭包作为属性
class CJLTeacher {
//定义一个闭包属性
var complitionHandler: ((Int)->Void)?
//函数参数使用@escaping修饰,表示允许函数返回之后调用
func makeIncrementer(amount: Int, handler: @escaping (Int)->Void){
var r