3

根据 NSObject 的文档:

重要提示:请注意,当应用程序终止时,可能不会向对象发送 dealloc 消息,因为进程的内存在退出时会自动清除 --- 简单地允许操作系统清理资源比调用所有内存管理更有效方法。

这很好,但是如果我的对象需要在 dealloc 上做一些事情,比如将其状态保存到磁盘或记录一些东西?如何确保调用该代码?

4

2 回答 2

8

持久性管理不应与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 中坚持自己的对象要好:-)

于 2010-10-29T11:48:42.427 回答
5

确保对象在您的applicationWillTerminate:( NSApplicationDelegate) 中被释放。

于 2010-10-29T11:48:10.077 回答