【问题标题】:How to make sure your dealloc code is called on application termination?如何确保在应用程序终止时调用您的 dealloc 代码?
【发布时间】:2010-10-29 11:44:31
【问题描述】:

根据 NSObject 的文档:

重要提示:请注意,当 应用程序终止,对象可能 不会收到 dealloc 消息,因为 进程的内存是自动的 退出时清除 --- 更多 有效的只是为了让 操作系统清理资源 而不是调用所有的内存 管理方法。

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

【问题讨论】:

  • 您可以在终止时使用 NSLog 并在应用终止后读取日志以检查它是否通过了 dealloc 方法。

标签: objective-c cocoa destructor dealloc


【解决方案1】:

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

【讨论】:

  • 您能详细说明一下吗? O:-)
【解决方案2】:

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

【讨论】:

  • 它不必在委托中。您可以在本地通知中心观察NSApplicationWillTerminateNotification
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多