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

Swift引用计数机制存疑:局部变量job销毁后dataTask为何仍能执行?

为什么URLSession的dataTask在局部变量销毁后仍能执行?

你的疑惑核心是对引用计数和任务持有关系的误解,下面直接说关键点:

  • URLSession会持有任务引用:当你通过URLSession.shared.dataTask(...)创建任务时,共享会话本身会在内部保留这个任务的引用,直到任务完成(成功、失败或被取消)。所以即便局部变量job在foo()执行完后被销毁、引用计数归0,URLSession还握着任务的引用,任务不会被释放,会继续执行直到完成。
  • 任务启动的前提:顺便提一句,你的示例代码里漏了job.resume()——dataTask创建后默认是挂起状态,必须调用这个方法才会开始执行。假设你实际代码里加了这行,那任务启动后就会被URLSession持续持有,直到它完成工作。
  • 闭包的存活逻辑:你传入的completionHandler闭包会被dataTask对象持有,而dataTask又被URLSession持有,所以闭包也会一直保持存活状态,直到任务结束,自然能被正常调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:02:01