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

使用URLSession的该简单场景是否会产生强引用循环?

关于Swift强引用与引用循环的疑问解答

你的理解完全正确,这段代码不存在引用循环。

针对你对第4点的困惑,核心原因在于局部变量和实例属性的本质区别:

  • task是makeRequest方法内部的局部变量,它的作用域仅局限于这个方法的执行过程中。当makeRequest方法执行到task.resume()之后,方法的执行流程就结束了,这个局部变量的生命周期也随之进入收尾阶段——只有URLSession.shared会因为需要管理任务生命周期而持有task的强引用,Model实例并没有任何逻辑去保存这个task。
  • 一个类实例要持有另一个对象的强引用,必须通过实例属性来存储该对象。你代码中的Model类只定义了foo这个可选Data类型的属性,没有任何用于存储URLSessionTask、URLSession或闭包的属性,所以Model实例根本不会对task、URLSession或闭包产生强引用。
  • 总结来说:方法里临时创建的局部变量,只要没有被赋值给类的实例属性,就不会让类实例持有它的引用。这里只有闭包持有Model实例的强引用,但Model实例并没有反向持有闭包或task的强引用,无法形成“互相引用”的闭环,因此不存在引用循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:40:01