You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift闭包内使用self是否会引发内存泄漏,必须写[weak self]吗

闭包使用self是否必须加[weak self]?

通用结论

不是所有使用了self的闭包都需要加[weak self],只有同时满足以下两个条件时,才会出现循环强引用导致内存泄漏,需要使用[weak self]或者[unowned self]规避:

  • self 对闭包存在强引用
  • 闭包内部对self存在强引用

你的示例场景分析

你之前的认知存在偏差:ViewControllerA 并不会对自身的showDeleteAlert方法持有强引用,类的方法存储在类的元数据结构中,不会和实例形成引用关系,所以你担心的循环引用前提不成立。
我们看你这个场景的实际引用链:

  1. deleteAction是showDeleteAlert内部的临时变量,你没有在ViewControllerA中声明属性持有它,最终只有系统的UIAlertController持有它的强引用
  2. 闭包强持有ViewControllerA,形成的引用链是:系统UIAlertController -> deleteAction -> 闭包 -> ViewControllerA
  3. 整个链条中ViewControllerA没有持有链条上的任何对象,不存在双向强引用,所以不会出现内存泄漏。

加和不加[weak self]的区别

  • 不加[weak self]:闭包会临时延长ViewControllerA的生命周期,只要弹窗还没被销毁(用户还没点按钮、弹窗未被系统回收),就算ViewControllerA被pop/dismiss了也不会立刻释放,等弹窗销毁后引用链断开,ViewControllerA会正常释放,不属于内存泄漏。如果你需要就算页面销毁了也要执行删除操作,可以选择不加。
  • 加[weak self]:如果ViewControllerA先于弹窗被销毁,闭包内的self会变为nil,删除逻辑不会执行,符合大多数业务场景的预期(页面都没了删完也不需要刷新页面了),属于更稳妥的最佳实践写法,不会有副作用。

最终结论

你给出的场景不是必须使用[weak self],不会产生内存泄漏,你当前的写法是完全合理的。

内容的提问来源于stack exchange,提问作者Yuuu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:45:00