2010-10-29 26 views
3

据NSObject中的文档:如何确保在应用程序终止时调用您的dealloc代码?

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

这很好,但如果我的对象需要做一些事情上的dealloc,比如保存其状态到磁盘或登录东西吗?我怎样才能确保代码被调用?

+0

您可以在终端使用的NSLog和读取日志后的应用程序已终止,以检查对象是否更好它通过dealloc方法或不通过。 – infinity 2010-10-29 11:49:10

回答

7

持久性的管理不应该依赖于dealloc。如果你想保存对象状态,你应该有某种会话对象,它会收集脏对象并且偶尔保存更改或者当应用程序终止/进入后台时。

使用应用程序设置一个例子:比方说,你不希望使用NSUserDefaults为你的应用程序的设置,也许是因为你有一些额外的逻辑来做。你有一个Settings类,保持所有的设置,显然你想保持更改持续。

你可以一下子就将这些持久性逻辑到Settings类,但违反了单一职责原则。 (=有很好的理由说明为什么这会导致你的痛苦。)所以你可以添加一个Session类,它将坚持Settings中所做的更改。

应用程序启动时,您将创建Session的实例,并要求Settings

Session *session = [[Session alloc] init]; 
Settings *settings = [session loadSettings]; 

现在,如果有一个包含保存的设置对磁盘上的文件,该会议将加载它(这是简单,因为Settings类实现了NSCoding)。如果没有,会话将创建一个新的实例并返回该实例。此外,该会议可能会开始观察返回的Settings实例的变化,例如使用NSNotificationCenter。 (当设置发生变化时,一个Settings对象会触发通知是很自然的。)

现在,当您更改从会话获取的Settings实例中的某个内容时,会话将会注意到该事件并会将更改保存到磁盘。这应该是微不足道的,因为Settings实施NSCoding。您也可以将该对象标记为脏,并且每隔几秒只保存一次更改,这对于更频繁地更新对象来说是更好的解决方案。在这种情况下,您可能还想在应用程序要结束或正在进行后台时强制保存会话。

我不是说这个方案是完美的,但它肯定比坚持自己的dealloc :-)

+0

请您详细说明一下吗?其他:-) – cfischer 2010-10-29 11:54:25

5

确保对象被你applicationWillTerminate:NSApplicationDelegate)公布。

+1

它不必在委托中。您可以在本地通知中心观察“NSApplicationWillTerminateNotification”。 – 2010-10-29 18:41:09

相关问题