非逃逸闭包
非逃逸闭包的生命周期:
- 把闭包作为参数传递给函数。
- 函数中运行该闭包。
- 退出函数。
非逃逸闭包被限制在函数内,当函数退出时,该闭包的引用计数不会增加,也就是说其引用计数在进入函数和退出函数时保持不变。
逃逸闭包
当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。
逃逸闭包生命周期长于相关函数,当函数退出时,逃逸闭包的引用仍然被其他对象持有,不会再相关函数结束后释放。
闭包参数默认是非逃逸类型。如果需要其逃逸类型的闭包,可以使用关键字@escaping
逃逸闭包使用场景
- 异步调用:如果需要调度队列中异步调用闭包,这个队列会持有闭包的引用,至于什么时候调用闭包,或者闭包什么时候运行结束都是不可预知的。
- 存储:需要存储闭包作为属性,全局变量或者其他类型做稍后使用。