一、闭包分为:
1.逃逸闭包(Escaping Closures)
2.非逃逸闭包(Nonescaping Closures)
在swift 3.0中,传递闭包到函数中的时候,系统会默认为非逃逸闭包类型
二、非逃逸闭包
非逃逸闭包的生命周期比较简单:
1.把闭包作为参数传递给函数。
2.函数中运行该闭包。
3.退出函数。
非逃逸闭包
显而易见是非逃逸闭包被限制在函数内,当函数退出的时候,该闭包引用计数不会增加,也就是说其引用计数在进入函数和退出函数时保持不变。
三、逃逸闭包
逃逸闭包恰恰与非逃逸闭包相反,其生命周期长于相关函数,当函数退出的时候,逃逸闭包的引用仍然被其他对象持有,不会在相关函数结束后释放。
Swift 3.x中, 闭包参数默认是非逃逸类型,如果需要其逃逸类型的闭包,记得使用关键字 @escaping
而对于非逃逸型闭包,由于其生命周期确定短于相关函数,编译器可以据此做性能优化。
注意
要谨慎使用@escaping(逃逸闭包),除非明确知道要使用它做什么。
下面是使用逃逸闭包的2个场景:
异步调用: 如果需要调度队列中异步调用闭包, 这个队列会持有闭包的引用,至于什么时候调用闭包,或闭包什么时候运行结束都是不可预知的。
存储: 需要存储闭包作为属性,全局变量或其他类型做稍后使用。