根据 NSObject 的文档:
重要提示:请注意,当应用程序终止时,可能不会向对象发送 dealloc 消息,因为进程的内存在退出时会自动清除 --- 简单地允许操作系统清理资源比调用所有内存管理更有效方法。
这很好,但是如果我的对象需要在 dealloc 上做一些事情,比如将其状态保存到磁盘或记录一些东西?如何确保调用该代码?
根据 NSObject 的文档:
重要提示:请注意,当应用程序终止时,可能不会向对象发送 dealloc 消息,因为进程的内存在退出时会自动清除 --- 简单地允许操作系统清理资源比调用所有内存管理更有效方法。
这很好,但是如果我的对象需要在 dealloc 上做一些事情,比如将其状态保存到磁盘或记录一些东西?如何确保调用该代码?
持久性管理不应与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 中坚持自己的对象要好:-)
确保对象在您的applicationWillTerminate:
( NSApplicationDelegate
) 中被释放。