iOS相关 | swift 闭包

一、闭包分为:
1.逃逸闭包(Escaping Closures)
2.非逃逸闭包(Nonescaping Closures)
在swift 3.0中,传递闭包到函数中的时候,系统会默认为非逃逸闭包类型

二、非逃逸闭包
非逃逸闭包的生命周期比较简单:
1.把闭包作为参数传递给函数。
2.函数中运行该闭包。
3.退出函数。

非逃逸闭包
显而易见是非逃逸闭包被限制在函数内,当函数退出的时候,该闭包引用计数不会增加,也就是说其引用计数在进入函数和退出函数时保持不变。

三、逃逸闭包
逃逸闭包恰恰与非逃逸闭包相反,其生命周期长于相关函数,当函数退出的时候,逃逸闭包的引用仍然被其他对象持有,不会在相关函数结束后释放。

Swift 3.x中, 闭包参数默认是非逃逸类型,如果需要其逃逸类型的闭包,记得使用关键字 @escaping

而对于非逃逸型闭包,由于其生命周期确定短于相关函数,编译器可以据此做性能优化。

注意

要谨慎使用@escaping(逃逸闭包),除非明确知道要使用它做什么。

下面是使用逃逸闭包的2个场景:
异步调用: 如果需要调度队列中异步调用闭包, 这个队列会持有闭包的引用,至于什么时候调用闭包,或闭包什么时候运行结束都是不可预知的。
存储: 需要存储闭包作为属性,全局变量或其他类型做稍后使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容