Swift中静态函数传递闭包是否会引发内存泄漏?
闭包传递给静态函数是否会引发内存泄漏?
你的代码会引发内存泄漏,问题根源不是静态函数,而是闭包形成的强引用循环,具体分析如下:
引用链分析
MyClass的实例通过section属性强持有Section实例Section实例强持有传入的didSelectHandler闭包didSelectHandler是MyClass的实例方法,闭包会隐式强捕获MyClass的self(调用实例方法必须依赖实例本身)- 最终形成
MyClass → Section → 闭包 → MyClass的强引用循环,导致两个对象都无法被ARC自动回收
修复方案
打破循环的核心是让闭包弱引用MyClass实例,修改createSections方法的闭包传递逻辑即可:
func createSections() { section = SectionBuilder.make(didSelectHandler: { [weak self] in self?.didSelectHandler() }) }
这样闭包不再强持有MyClass实例,当MyClass被释放时,循环引用就会被打破。
补充说明
SectionBuilder的静态函数只是负责中转闭包并创建Section实例,它本身不会持有任何对象引用,所以静态函数并不是内存泄漏的诱因。内存泄漏的本质是闭包的强引用捕获逻辑,和函数是否静态无关。
内容的提问来源于stack exchange,提问作者Burak Akyalçın
相关产品推荐
相关产品推荐

