cfi*_*her 3 cocoa destructor objective-c dealloc
根据NSObject的文档:
重要说明:请注意,当应用程序终止时,可能不会向对象发送dealloc消息,因为进程的内存在退出时会自动清除---仅仅允许操作系统清理资源比调用所有内存管理更有效方法.
这很好,但是如果我的对象需要在dealloc上做一些事情,比如将状态保存到磁盘或记录某些东西?如何确保调用代码?
持久性管理不应该与之相关dealloc.如果要保存对象状态,则应该使用某种会话对象来收集脏对象,并在应用程序终止/进入后台时保存更改.
使用应用程序设置的示例:假设您不想使用NSUserDefaults应用程序的设置,可能是因为您有一些额外的逻辑要做.您有一个Settings保持所有设置的类,显然您希望保持更改.
您可以将所有持久性逻辑填充到Settings类中,但这违反了单一责任原则.(=这有很好的理由说明为什么会让你感到痛苦.)所以你可以添加一个 Session类来保持所做的更改Settings.
当应用程序启动时,您将创建一个实例,Session并要求Settings:
Session *session = [[Session alloc] init];
Settings *settings = [session loadSettings];
Run Code Online (Sandbox Code Playgroud)
现在,如果磁盘上有一个包含已保存设置的文件,则会话将加载它(这很简单,就像Settings类实现的那样NSCoding).如果没有,会话将创建一个新Settings实例并返回该实例.此外,会话可能会开始监视返回Settings实例中的更改,比如使用NSNotificationCenter.(Settings当设置发生变化时,对象会触发通知,这很自然.)
现在,当您更改Settings从会话中获取的实例内的某些内容时,会话将注意到它并将更改保存到磁盘.自从Settings实施以来,这应该是微不足道的NSCoding.您还可以将对象标记为脏,并且每隔几秒只保存更改,这是一个更好的解决方案,以防您经常更新对象.在这种情况下,您可能还希望在应用程序要终止或正在进行后台时强制保存会话.
我不是说这种情况是完美的,但它肯定比坚持dealloc的对象更好:-)
| 归档时间: |
|
| 查看次数: |
569 次 |
| 最近记录: |