在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
闭包只有在函数中做参数时才会区分逃逸闭包和非逃逸闭包。 Swift 3.0之后,传递闭包到函数中的时候,系统会默认为非逃逸闭包类型(NonescapingClosures)@noescaping,逃逸闭包在闭包前要添加@escaping关键字。 从生命周期看两者区别: 非逃逸闭包的生命周期与函数相同: 1,把闭包作为参数传给函数; 2,函数中调用闭包; 3,退出函数。结束 逃逸闭包的生命周期: 1,闭包作为参数传递给函数; 2,退出函数; 3,闭包被调用,闭包生命周期结束 即逃逸闭包的生命周期长于函数,函数退出的时候,逃逸闭包的引用仍被其他对象持有,不会在函数结束时释放 例如: 非逃逸闭包: 代码执行顺序(1),(2),(3) 当传递闭包参数给函数loadData时,要注意ViewController中的属性tools,虽然闭包会捕获self,但是由于默认闭包参数是非逃逸型,这里可以省略self,编译器已经知道这里不会有循环引用的潜在风险。 逃逸闭包: 代码执行顺序:(1),(3),(2)
当传递闭包参数给函数loadData时,要注意ViewController中的属性tools,这里闭包函数的生命周期在函数结束后结束,tools前面省略的self 就有必要做特殊处理,防止造成死循环。逃逸闭包前面添加@escaping关键字,这里闭包的生命周期不可预知。 经常使用逃逸闭包的2个场景:
|
请发表评论