根据NSObject的文件:
重要提示:请注意 应用程序终止,对象可以 从那以后不会发送dealloc消息 进程的内存是自动的 退出时清除---更多 高效只是为了让 操作系统来清理资源 而不是调用所有的记忆 管理方法。
没关系,但如果我的对象需要在dealloc上执行某些操作,例如将其状态保存到磁盘或记录某些内容?如何确保代码被调用?
答案 0 :(得分:7)
持久性管理不应与dealloc
绑定。如果要保存对象状态,则应该使用某种会话对象来收集脏对象,并在应用程序终止/进入后台时保存更改。
使用应用程序设置的示例:假设您不希望将NSUserDefaults
用于应用程序的设置,可能是因为您有一些额外的逻辑要做。您有一个Settings
类来保留所有设置,显然您希望保持更改。
您可以将所有持久性逻辑填充到Settings
类中,但这违反了单一责任原则。 (=这有很好的理由说明为什么会让你感到痛苦。)因此,您可以添加一个Session
类来保留Settings
中所做的更改。
当应用程序启动时,您将创建Session
的实例并要求Settings
:
Session *session = [[Session alloc] init];
Settings *settings = [session loadSettings];
现在,如果磁盘上有一个包含已保存设置的文件,会话将加载它(这很简单,因为Settings
类实现了NSCoding
)。如果没有,会话将创建一个新的Settings
实例并返回该实例。此外,会话可能会开始关注返回的Settings
实例中的更改,例如使用NSNotificationCenter
。 (当设置发生变化时,Settings
对象触发通知是很自然的。)
现在当您更改从会话中获得的Settings
实例内的某些内容时,会话将注意到它并将更改保存到磁盘。这应该是微不足道的,因为Settings
实施NSCoding
。您还可以将对象标记为脏,并且每隔几秒只保存更改,这是一个更好的解决方案,以防您经常更新对象。在这种情况下,您可能还希望在应用程序要终止或正在后台时强制保存会话。
我不是说这种情况是完美的,但它肯定比坚持dealloc的对象更好: - )
答案 1 :(得分:5)
确保该对象在applicationWillTerminate:
(NSApplicationDelegate
)中发布。