Swift escaping逃逸闭包运行生命周期测试问题
问题原因解答
@escaping是权限标记而非执行时机强制规则@escaping关键字的作用仅为允许闭包在所属函数返回后仍可被外部持有、调用,不会强制要求闭包必须延后到函数返回后才执行。如果代码中在函数体内同步调用了标记为逃逸的闭包,它的执行表现和普通非逃逸闭包完全一致。- 测试代码没有实现闭包逃逸的逻辑
你的escapingexample函数接收逃逸闭包后,直接在函数体内同步执行了c(),既没有将闭包存储到外部变量/属性中,也没有将其放入异步队列延后执行。同时你虽然在闭包中访问了completionHandlers数组,但并没有把当前闭包追加到数组里持有,函数执行完成后闭包就会被立即释放,自然不会出现“长期存活、函数返回后执行”的效果。
正确测试逃逸闭包的示例
你可以修改escapingexample函数,将闭包放入异步队列执行,就能直观看到逃逸效果:
import Dispatch func escapingexample (c: @escaping ()->Void){ print("escapingex body starts" + String(clock())) // 将闭包丢到主队列异步执行,会等待当前函数栈执行完成后才调用 DispatchQueue.main.async { c() } print("escapingex body ends" + String(clock())) }
修改后运行会先打印函数结束的日志,再打印闭包内的日志,符合逃逸闭包的执行特征。
内容的提问来源于stack exchange,提问作者user15262125
相关产品推荐
相关产品推荐

