如何确保在应用程序终止时调用dealloc代码?

时间:2010-10-29 11:44:32

标签: objective-c cocoa destructor dealloc

根据NSObject的文件:

  

重要提示:请注意   应用程序终止,对象可以   从那以后不会发送dealloc消息   进程的内存是自动的   退出时清除---更多   高效只是为了让   操作系统来清理资源   而不是调用所有的记忆   管理方法。

没关系,但如果我的对象需要在dealloc上执行某些操作,例如将其状态保存到磁盘或记录某些内容?如何确保代码被调用?

2 个答案:

答案 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)中发布。