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

使用Coordinator模式时遇到的诡异循环引用问题

分析与解决方案:Coordinator架构下的注册流程内存泄漏问题

看起来你遇到的是循环引用导致的内存泄漏,核心问题出在RegisterCoordinator和它的根视图控制器PhoneInputViewController之间的强引用链上,我来一步步拆解并给出解决办法:

一、定位强引用来源

根据你的代码描述和现象(只有RegisterCoordinator和PhoneInputViewController未释放,其他注册流程的VC正常释放),最可能的原因是:

  • PhoneInputViewController的delegate属性被声明为强引用(strong),而非弱引用(weak)
  • RegisterCoordinator本身强持有PhoneInputViewController(通过rootViewController属性),如果delegate是强引用,就会形成闭环:RegisterCoordinator -> PhoneInputViewController -> delegate -> RegisterCoordinator
  • 即使AppCoordinator清空了childCoordinators,这个内部循环引用也会让两者互相持有,无法被ARC回收

其他VC(比如PhoneValidationViewController)能正常释放的原因是:它们只被导航栈和RegisterCoordinator的delegate引用,当导航栈被替换后,导航栈的强引用消失,而如果它们的delegate是弱引用,就不会形成循环,所以能被正常回收。

二、具体修复步骤

1. 修正所有Delegate的引用类型

所有视图控制器的Delegate协议必须继承AnyObject(确保只能被类实现),并且delegate属性声明为weak+可选类型:

比如PhoneInputViewController的代码应该调整为:

// 协议必须继承AnyObject
protocol PhoneInputViewControllerDelegate: AnyObject {
    func phoneInputDone()
}

class PhoneInputViewController: UIViewController {
    // 用weak修饰delegate,避免强引用
    weak var delegate: PhoneInputViewControllerDelegate?
    
    // ...其他业务代码
}

同理,PhoneValidationViewControllerDelegate、GenderSelectionViewController的相关Delegate也要做同样的修改,确保所有委托属性都是弱引用。

2. 确保Coordinator的生命周期管理正确

在AppCoordinator的start()方法中,你已经清空了childCoordinators,这一步是对的,但可以额外检查:

  • 确认pushCoordinator方法是将子协调器添加到childCoordinators,并且当子协调器完成流程后,能主动从父协调器的子列表中移除(比如在注册完成的回调中调用移除逻辑)
  • 如果使用的Coordinator库自带了子协调器管理方法,确保正确调用removeChildCoordinator(_:)来清理不再需要的协调器

3. 用Memory Graph Debugger验证修复效果

你可以用Xcode的Memory Graph Debugger直观确认泄漏是否解决:

  1. 运行App,完成注册流程,触发authStateChanged切换根视图控制器
  2. 点击调试栏中的Debug Memory Graph按钮(📊图标)
  3. 在左侧列表中查找RegisterCoordinator和PhoneInputViewController,如果它们已经被回收,就不会出现在列表中;如果还存在,查看它们的引用链,确认是否还有其他未处理的强引用

三、额外优化建议

  • 对于Coordinator的根视图控制器,强持有是合理的(协调器作为VC的生命周期管理者),只要确保VC的委托是弱引用即可
  • 在Coordinator完成任务后,主动触发父协调器移除自己,比如在注册流程的最后一步(保存用户信息)中,调用parentCoordinator?.removeChildCoordinator(self)(需要给Coordinator添加parentCoordinator属性)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:22:57