Swift闭包内使用self是否会引发内存泄漏,必须写[weak self]吗
闭包使用self是否必须加
[weak self]? 通用结论
不是所有使用了self的闭包都需要加[weak self],只有同时满足以下两个条件时,才会出现循环强引用导致内存泄漏,需要使用[weak self]或者[unowned self]规避:
- self 对闭包存在强引用
- 闭包内部对self存在强引用
你的示例场景分析
你之前的认知存在偏差:ViewControllerA 并不会对自身的showDeleteAlert方法持有强引用,类的方法存储在类的元数据结构中,不会和实例形成引用关系,所以你担心的循环引用前提不成立。
我们看你这个场景的实际引用链:
deleteAction是showDeleteAlert内部的临时变量,你没有在ViewControllerA中声明属性持有它,最终只有系统的UIAlertController持有它的强引用- 闭包强持有ViewControllerA,形成的引用链是:
系统UIAlertController -> deleteAction -> 闭包 -> ViewControllerA - 整个链条中ViewControllerA没有持有链条上的任何对象,不存在双向强引用,所以不会出现内存泄漏。
加和不加[weak self]的区别
- 不加
[weak self]:闭包会临时延长ViewControllerA的生命周期,只要弹窗还没被销毁(用户还没点按钮、弹窗未被系统回收),就算ViewControllerA被pop/dismiss了也不会立刻释放,等弹窗销毁后引用链断开,ViewControllerA会正常释放,不属于内存泄漏。如果你需要就算页面销毁了也要执行删除操作,可以选择不加。 - 加
[weak self]:如果ViewControllerA先于弹窗被销毁,闭包内的self会变为nil,删除逻辑不会执行,符合大多数业务场景的预期(页面都没了删完也不需要刷新页面了),属于更稳妥的最佳实践写法,不会有副作用。
最终结论
你给出的场景不是必须使用[weak self],不会产生内存泄漏,你当前的写法是完全合理的。
内容的提问来源于stack exchange,提问作者Yuuu
相关产品推荐
相关产品推荐

