UISplitViewController展示详情页返回后对应ViewController的deinit未调用问题咨询
问题解答
核心结论
这不是UISplitViewController的默认行为,按照ARC的内存管理规则,视图控制器在被移出视图层级、且没有被任何其他对象强持有时,就会被自动回收并触发deinit方法。
常见原因排查
你提到使用UINavigationControllerpush时deinit可以正常触发,说明BasicExampleViewController内部不存在循环引用问题,优先从UISplitViewController的使用逻辑排查:
- 如果你使用的是iOS 14及以上推出的列风格UISplitViewController(通过
init(style:)初始化的三列/双列样式),系统默认会缓存次级列(secondary)的控制器,就算你点击返回按钮,次级列的控制器也不会被自动置空,会一直被UISplitViewController强持有,导致无法释放。 - 如果你实现了UISplitViewController的自定义代理,需要检查
splitViewController:showDetailViewController:sender:等代理方法中有没有对传入的详情控制器做额外的强持有。 - 检查你用于包裹详情控制器的自定义
NavigationController,有没有属性强持有了自己的rootViewController。
修复方案
如果是列风格UISplitViewController的缓存机制导致的问题,可以在返回逻辑中手动将次级列的控制器置空即可触发正常释放:
splitViewController?.setViewController(nil, for: .secondary)
内容的提问来源于stack exchange,提问作者tanmoy
相关产品推荐
相关产品推荐

