Swift代码未出现预期内存泄漏的原因咨询:强引用环为何未生效?
问题解答:为什么没有出现预期的内存泄漏?
- 你忽略的核心事实:代码从未调用
saveClosure()方法,Dog实例的run属性始终是默认的nil,根本没有形成强引用环的基础。 - 强引用环的形成条件:只有当
Dog的run被赋值为持有self的闭包时,才会出现「self强引用闭包 + 闭包强引用self」的循环引用。你的代码里run一直是nil,不存在双向强引用,自然不会有内存泄漏。 - 引用计数的实际变化:创建
choco实例时,引用计数为1;doSomething()执行完毕后,局部变量choco被销毁,引用计数降为0,Dog实例被正常释放,因此触发deinit输出日志。 - 关于你提供的第二个代码块:它和第一个代码逻辑完全一致,同样没有调用
saveClosure(),所以也不会产生内存泄漏。如果要复现内存泄漏,需要补充调用saveClosure(),示例代码如下:
func doSomethiing() { let choco: Dog? = Dog() choco?.saveClosure() // 调用此方法才会赋值run,形成强引用环 }
此时run闭包持有self的强引用,self又持有run的强引用,形成循环引用,Dog实例的引用计数无法降为0,deinit不会触发,才会出现内存泄漏。
内容的提问来源于stack exchange,提问作者suojae3
相关产品推荐
相关产品推荐

