Swift引用计数机制存疑:局部变量job销毁后dataTask为何仍能执行?
为什么URLSession的dataTask在局部变量销毁后仍能执行?
你的疑惑核心是对引用计数和任务持有关系的误解,下面直接说关键点:
- URLSession会持有任务引用:当你通过
URLSession.shared.dataTask(...)创建任务时,共享会话本身会在内部保留这个任务的引用,直到任务完成(成功、失败或被取消)。所以即便局部变量job在foo()执行完后被销毁、引用计数归0,URLSession还握着任务的引用,任务不会被释放,会继续执行直到完成。 - 任务启动的前提:顺便提一句,你的示例代码里漏了
job.resume()——dataTask创建后默认是挂起状态,必须调用这个方法才会开始执行。假设你实际代码里加了这行,那任务启动后就会被URLSession持续持有,直到它完成工作。 - 闭包的存活逻辑:你传入的completionHandler闭包会被dataTask对象持有,而dataTask又被URLSession持有,所以闭包也会一直保持存活状态,直到任务结束,自然能被正常调用。
内容的提问来源于stack exchange,提问作者user2848557
相关产品推荐
相关产品推荐

