objective-c - 如何确保在应用程序终止时调用您的 dealloc 代码?

标签 objective-c cocoa destructor dealloc

根据 NSObject 的文档:

Important: Note that when an application terminates, objects may not be sent a dealloc message since the process's memory is automatically cleared on exit --- it is more efficient simply to allow the operating system to clean up resources than to invoke all the memory management methods.

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

最佳答案

持久性管理不应与 dealloc 绑定(bind)。如果你想保存对象状态,你应该有某种 session 对象来收集脏对象并偶尔或在应用程序终止/进入后台时保存更改。

一个使用应用程序设置的例子:假设你不想为你的应用程序设置使用 NSUserDefaults,可能是因为你有一些额外的逻辑要做。您有一个保留所有设置的 Settings 类,显然您希望保留更改。

您可以将所有持久性逻辑塞入 Settings 类,但这违反了单一责任原则。 (= 有充分的理由说明为什么这会让您感到痛苦。)因此您可以添加一个 Session 类,该类将保留在 Settings 中所做的更改。

当应用程序启动时,您将创建一个 Session 实例并请求 Settings:

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

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

现在,当您更改从 session 获得的 Settings 实例中的某些内容时, session 会注意到这一点,并将更改保存到磁盘。这应该是微不足道的,因为 Settings 实现了 NSCoding。您还可以将对象标记为脏对象,并且仅每隔几秒保存一次更改,如果您非常频繁地更新对象,这是一个更好的解决方案。在这种情况下,您可能还想在应用程序即将终止或进入后台时强制保存 session 。

我并不是说这个场景是完美的,但它肯定比在 dealloc 中持久化自身的对象要好:-)

关于objective-c - 如何确保在应用程序终止时调用您的 dealloc 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051476/

相关文章:

c++ - std::vector 在重新分配时无论如何调用包含对象的析构函数?

objective-c - OS X 10.10.3 和通知中心

objective-c - 寻找 cocoa 谷歌地图包装器框架

objective-c - Mac 上使用 Objective-C 的图像处理资源

cocoa - 启动 Cocoa 应用程序而不显示主窗口

c++ - 析构函数末尾的段错误

c++ - 在分配为不同类型的数组上使用 delete[] 是否安全?

ios - 如何在 ios 上获取通过 Facebook 登录的用户的名字?

objective-c - 当我单击“删除”按钮时,为什么会删除大纲 View 底部的行而不是选定的行?

objective-c - 指向整数的指针