URLSession数据任务闭包中是否需要使用weak self?
结论:完全不需要使用
[weak self],你的判断是对的 具体原因:
- 单例的生命周期特性:
APISingleton是单例,它的实例会伴随整个App运行周期存在,永远不会被ARC自动回收。就算闭包强持有self,也不会造成内存泄漏——单例本身就设计为长期存活,不存在“不该被保留却被持有”的问题。 - 不存在循环引用的条件:循环引用需要两个对象互相强持有。这里
dataTask的闭包会被URLSession临时持有,但APISingleton并没有持有这个闭包(闭包是方法内的局部变量,任务完成后URLSession会释放它),双方形成不了互相持有的闭环,完全不用担心循环引用。 - 多余的
guard let self检查:因为单例永远不会被释放,这个判断分支永远不会触发,属于无效代码,可以直接删除。
另外补充:如果闭包内不需要访问self的属性或方法,甚至连self都不用捕获,直接去掉相关引用即可。
内容的提问来源于stack exchange,提问作者Fattie
相关产品推荐
相关产品推荐

