7

我在对象的 init 方法中从 NSUserDefaults 加载。我可以在对象的 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]调用。这让我有点紧张,但我把我的信任放在了苹果上。:)

4

2 回答 2

7

这很糟糕,因为在调用 -dealloc 时,其他对象已经放弃了对它的兴趣。这可能有很多不同的含义。

设置用户默认值的更好地方是设置更改的那一刻。这样,它会立即持久化,并且应用程序可以被终止,而不必担心设置不会持久化,因为您的部分对象图可能已经消失了。

于 2010-11-13T22:58:30.787 回答
0

在 -dealloc 中同步用户默认值与其他任何地方没有什么不同。这是因为,尽管看起来很疯狂,但 -dealloc 一点也不神奇,而且与 C++ 析构函数不同,-dealloc 实际上是一个典型的方法。您可能会稍微担心将 self.filenamesArray 传递给 userDefualts,因为这实际上是在实际解除分配之后可能保留的东西,但我相信用户默认会保留它。

至于你什么时候应该[userDefaults synchronize];,人们各不相同,我个人不同意@Joshua——我从来没有明确地同步,而是让 NSUserDefaults 来处理它。除非我大错特错,否则它会在应用程序关闭时自动触发,否则会定期触发。因为它知道何时更新,并且需要一次写入整个 plist 文件,所以我认为我宁愿让 Apple 的算法处理何时写入默认值,因为它需要很长时间(因为它写入文件系统)。

(请注意,如果您的用户默认值有特殊情况,例如另一个应用程序读取/写入它们,则最后一段都不适用)

于 2010-11-13T23:26:01.280 回答