我从NSUserDefaults加载到对象的init方法中。 我可以在对象的dealloc方法中保存到NSUserDefaults吗?
完全像:
-(void)dealloc {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
[userDefaults synchronize];
self.filenamesArray = nil;
self.defaultsKey = nil;
[super dealloc];
}
好,坏,好吗?如果它不好,哪里会更好。
编辑:
感谢您的详细回复。所有这些都是有道理的。我发现为什么这是一个保存到用户默认值的不好的地方的另一个原因是,只有当一个对象很好地解除分配时才会调用dealloc。如果我的应用程序被杀死,此代码永远不会运行。同样,如果将应用程序推入后台(iOS 4),则无法运行。
我还删除了明确的[userDefaults synchronize]
电话。这让我有些紧张,但我相信苹果就是这个。 :)
答案 0 :(得分:7)
这很糟糕,因为在调用-dealloc时,其他对象已经放弃了它。这可能有很多不同的含义。
设置用户默认值的最佳位置是设置更改的时刻。这样它就会立即存在,并且可以杀死应用程序而不必担心设置没有被保留,因为对象图的某些部分可能已经消失了。
答案 1 :(得分:0)
在-dealloc中同步用户默认值与其他任何地方都没有区别。这是因为,虽然看起来很疯狂,但是-dealloc绝不是神奇的,而且与C ++析构函数不同,-dealloc实际上是一种典型的方法。您可能会稍微担心将self.filenamesArray传递给userDefualts,因为这实际上可能会超过实际的释放,但我相信用户默认保留它。
至于你应该[userDefaults synchronize];
的时候,人们会有所不同,我个人不同意@Joshua - 我从来没有明确地同步,而是让NSUserDefaults来处理它。除非我非常误,否则当应用程序关闭时会自动触发,否则会定期触发。因为它知道它何时被更新,并且它需要立即写入整个plist文件,我认为我宁愿让Apple的算法处理时间来编写默认值,因为它需要非常重要的时间(因为它写入文件系统)。
(请注意,如果您的用户默认值存在特殊情况,则最后一段不适用,例如另一个应用程序读/写它们)