在AppDelegate中实例化的ItemStore对象是否会永久存在?
关于AppDelegate中实例化的ItemStore对象生命周期的解答
Great question! Let's break this down clearly:
核心结论
是的,只要你的App处于前台运行状态,且没有被系统或用户强制终止,你在AppDelegate中实例化的ItemStore对象会一直存在。
具体原因
- AppDelegate的生命周期绑定App前台生命周期:AppDelegate是iOS应用的核心代理对象,它在App启动时被初始化,只要App没有被完全终止(比如用户从后台划掉App,或者系统因严重内存不足杀死App进程),AppDelegate实例就会一直存活。如果你的
ItemStore是作为AppDelegate的一个强引用存储属性(比如let itemStore = ItemStore()),那么ARC(自动引用计数)会保证它不会被回收,只要AppDelegate还在。 - 例外情况:当App进入后台后,如果系统内存紧张,可能会将App进程杀死,此时AppDelegate和它持有的
ItemStore实例都会被销毁。下次用户重新打开App时,会重新初始化AppDelegate和新的ItemStore实例。
和逆依赖注入的关联
你提到通过UITableViewController的未包装属性访问这个ItemStore,这种方式虽然能工作,但其实违背了逆依赖注入的核心思想——依赖应该被注入,而不是主动获取。如果后续你想替换ItemStore的实现(比如测试时用Mock版本),直接依赖AppDelegate的方式会让代码变得难以修改和测试。
更好的做法是:
- 在AppDelegate中创建
ItemStore实例后,通过控制器的初始化方法或者属性将它注入进去(比如let todoVC = TodoTableViewController(itemStore: itemStore)) - 这样控制器只需要依赖
ItemStore的协议(如果定义了的话),而不是依赖AppDelegate,同时ItemStore的生命周期依然和AppDelegate保持一致,不会因为注入方式改变而提前被回收。
内容的提问来源于stack exchange,提问作者Laurence Wingo
相关产品推荐
相关产品推荐

