Swift代码是否会引发循环引用?是否需使用弱引用捕获列表?
关于闭包中
self是否需要弱引用的分析 先给你吃个定心丸:你的这段代码里不需要把self设为弱引用,原因我给你拆解清楚:
循环引用的核心条件
循环引用只会在「两个对象互相强引用」的时候发生——简单说就是:A强持有B,同时B也强持有A,导致两者都无法被系统释放。咱们对照你的代码来看:
1. NPWebService.getTextFileData的闭包
这个闭包是作为参数传递给网络请求方法的,这类闭包的生命周期非常短:网络请求完成后,闭包被调用一次,之后就会被系统销毁。它并不会被self或者self的任何属性持有,只是被网络请求的临时内部对象短暂持有。哪怕闭包里强引用了self,只要闭包能被及时释放,就不会形成循环引用。
2. DispatchQueue.main.async的内部闭包
同样的道理,这个闭包是交给GCD的主队列去执行,队列只会在闭包执行完成后就把它释放掉,它也不会被self持有。哪怕闭包里调用了self.updateUI(),也不会造成循环引用。
什么时候才需要用弱引用?
只有当闭包会被self长期持有的时候,才需要考虑用[weak self]打破循环。比如:
- 你把这个闭包赋值给了
self的某个属性(比如self.completionHandler = { ... self ... }) - 闭包被另一个会被
self持有的对象长期持有
最后总结一下:你的代码里两个闭包都是一次性的临时闭包,执行完就销毁,不存在循环引用的风险,完全不需要加弱引用。
内容的提问来源于stack exchange,提问作者Clip
相关产品推荐
相关产品推荐

