You need to enable JavaScript to run this app. Swift escaping逃逸闭包运行生命周期测试问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 23:45:08