NSUserDefaults 有时 returns 错误值

NSUserDefaults sometimes returns wrong value

我将用户的用户个人资料图片 ID 作为字符串保存在 NSUserDefaults 中,例如@“12”。当我这样做时,我会立即调用同步方法。

当我从 NSUserDefaults 中读取这个值时,它 returns @"12" 可能有 99% 的时间。但有时,它 returns 是一个不同的值(由于事件的稀有性我无法找到它,但怀疑它是 nil 或某个默认值(?))。

我用来write/read的代码很简单:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"12" forKey:@"photoID"];
[userDefaults synchronize];

NSString* photoID=[userDefaults objectForKey:@"photoID"];

我知道有时返回的值是不正确的,因为当时应用程序的行为就像该值不同一样(即用户联系人会收到个人资料图片已更改的通知)。

当发生这种情况时,下一次调用 objectForKey returns 正确的值,因此用户联系人收到另一个通知,个人资料图片再次更改。

NSSynchronize 不保证成功,returns 一个 BOOL。 请注意,syncrhonize 只是将数据写入磁盘,但 NSUserDefaults 也会将数据保存在内存中。可能不需要在每次写入后调用它,尽管我自己做过,网上有很多例子都是这样做的。

来自 Apple 文档:

use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.

免责声明:推测
同步失败的行为可能导致 objectForKey 失败。 class 知道它拥有的数据可能是错误的,所以 returns nil 代替。如果您连续过度地调用同步或以其他方式执行 IO 密集型操作,则更有可能出现这种情况。