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
相关产品推荐
相关产品推荐

