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

