NSUserDefaults有时会返回错误的值

时间:2015-11-13 02:46:42

标签: ios nsuserdefaults

我将用户的用户个人资料图片ID保存为NSUserDefaults中的字符串,例如@" 12&#34 ;.当我这样做时,我立即调用同步方法。

当我从NSUserDefaults读取这个值时,它返回@" 12"大概99%的时间。但有时候,它返回一个不同的值(由于事件的罕见性,我无法找到它,但怀疑它是零或某个默认值(?))。

我用来编写/读取的代码非常简单:

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

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

我知道有时返回的值不正确,因为当时的应用程序表现得好像值不同(即通知用户联系人个人资料图片已更改)。

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

1 个答案:

答案 0 :(得分:3)

NSSynchronize无法保证成功并返回BOOL。 请注意,syncrhonize只是将数据写入磁盘,但NSUserDefaults也将数据保存在内存中。可能不需要在每次写入之后调用它,尽管我自己已经完成了它并且网络上的许多示例都是这样做的。

来自Apple文档:

  

仅当您不能等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为磁盘上的内容,即使您尚未进行任何更改,也请使用此方法。

免责声明:猜测 同步失败的行为可能导致objectForKey失败。该类知道它可能有错误的数据,因此返回nil。如果您连续和过度地调用同步或以其他方式进行IO密集型操作,则更有可能。