You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift并发中withCheckedContinuation与[weak self]的协同使用问题

Swift:同时满足withCheckedContinuation的resume调用与避免循环引用

问题核心

你的代码存在两个矛盾点:要么self提前释放时跳过resume()导致内存泄漏,要么不用[weak self]引发强引用循环,还不想改用withCheckedThrowingContinuation增加复杂度。

修正后的代码

func someAsyncFunc() async {
    loadingTask?.cancel()
    await withCheckedContinuation { checkedContinuation in
        loadingTask = Task { [weak self] in
            defer {
                checkedContinuation.resume()
            }
            guard let self else {
                return
            }
            // 这里写需要用到self的代码
        }
    }
}

关键说明

  • 保证resume必调用:用defer包裹checkedContinuation.resume(),不管Task内部逻辑走到哪一步(哪怕self已释放直接return),resume()都会执行,完全符合文档要求,不会因漏调用导致内存泄漏
  • 避免循环引用:仅在Task的捕获列表中添加[weak self]即可——withCheckedContinuation的闭包生命周期极短,不会持有self形成循环;而Task是异步后台执行的,必须用弱引用防止循环
  • 简化逻辑:删掉withCheckedContinuation闭包里的[weak self],此处无需弱引用,既减少了冗余代码,也避免了因self提前释放导致resume()没机会执行的问题

这样就同时解决了两个问题,代码简洁且无需更换其他continuation类型。

内容的提问来源于stack exchange,提问作者Gargo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:55:09