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

UIAlertAction的handler是否需用[weak self]/[unowned self]避免循环引用?

UIAlertAction的handler是否需要弱引用self?

结论:示例场景下无需使用[weak self]或[unowned self]

你给出的代码里,直接强引用self不会造成循环引用,理由如下:

  1. 引用链分析:

    • self(UIViewController)调用present显示alert,但self并没有强引用这个alert实例(alert是局部变量,present后仅由UIKit的视图层级临时持有)。
    • alert持有UIAlertAction,UIAlertAction持有handler闭包,闭包持有self。但这条引用链是单向的:当alert被dismiss后,UIKit会释放对alert的持有,alert、action、闭包都会被销毁,闭包对self的强引用也随之消失,不存在循环引用的闭环。
  2. 什么时候才需要弱引用?
    只有当闭包的持有者被self强引用时,才会形成循环引用:

  • 比如如果self有一个属性var alert: UIAlertController?,并把局部的alert赋值给这个属性,此时self强引用alert,alert强引用action,action强引用闭包,闭包强引用self,形成闭环,这时候必须用[weak self]或[unowned self]。

通用判断逻辑

判断闭包是否需要弱引用self,只需两步:

  • 第一步:确定闭包的最终持有者是谁(比如这里是UIAlertAction,归属alert)
  • 第二步:检查这个持有者是否被self强引用(包括直接属性持有、间接被self强引用的对象持有)
  • 如果两者同时成立(闭包持有self + 持有者被self强引用),就会形成循环引用,必须用弱引用;否则可以直接强引用。

强引用self在闭包里的核心问题

强引用self的主要风险确实是循环引用导致内存泄漏,其次是延迟执行的闭包可能导致self被意外保留(比如闭包在后台线程等待执行,而self本应被释放)。但在UIAlertAction的场景中,handler要么在用户点击按钮时立即执行,要么随alert被dismiss一起销毁,不会出现self被意外长期保留的情况。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:10:25