NSUserDefaults 并不总是保存我的 NSString 数据

Posted

技术标签:

【中文标题】NSUserDefaults 并不总是保存我的 NSString 数据【英文标题】:NSUserDefaults is not always saving my NSString data 【发布时间】:2012-01-27 00:51:32 【问题描述】:

我遇到了一些令人费解的事情。我有一些基本的字符串数据正在尝试保存到 NSUserDefaults,如下所示:

NSString *state = @"finished";
[[NSUserDefaults standardUserDefaults] setObject:state forKey:@"downloadFinished"];
[[NSUserDefaults standardUserDefaults] synchronize];

当应用启动时,它决定加载哪个视图的方法之一是检查此用户设置的值:

NSString *savedState = [[NSUserDefaults standardUserDefaults] stringForKey:@"downloadFinished"]
if(savedState && [savedState length]) 
  // Show view

每隔一段时间,我就会注意到该值无法加载,即使我确定该值之前已保存(或至少,该应用程序之前尝试过保存它)。发生这种情况时,当我从用户默认值中查找“downloadFinished”键时,我会得到一个 nil 值。

以前有人遇到过这种情况吗?是否有任何关于为什么会发生这种情况的知识?保存到用户的默认缓存和默认数据库失败的可能性有多大,有没有办法进一步防止这种情况发生?

我将尝试Why is NSUserDefaults not saving my values?中提到的解决方案,它会在应用进入后台时强制另一个同步,但我想知道是否有人对此有更深入的了解。

【问题讨论】:

这里不是解决方案,但为什么不为您的 downloadFinished 键使用 BOOL 值? 您是否从您的 stringForKey: 调用中得到 nil 或空字符串?根据文档,nil 表示在 NSUserDefaults 中找不到密钥。 @MichaelDautermann the downloadFinished 是一个例子——我实际上是在尝试保存一个字符串。 @bneely 我得到了零回报。是的,我相信这是真的——没有找到密钥,这告诉我同步没有正确完成。 您是否在设备上、模拟器中或两者都复制过? 【参考方案1】:

我猜这里有一些数据类型问题。 你可以试试这个,看看有没有收获?

NSString *savedState = [[NSUserDefaults standardUserDefaults] objectForKey:@"downloadFinished"]

注意objectForKey用法

【讨论】:

我会试一试。如果它起作用,那么当 stringForKey 不起作用时,它涉及 objectForKey 会起作用。数据肯定保存为 NSString。

以上是关于NSUserDefaults 并不总是保存我的 NSString 数据的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 并不总是保存更改

NSUserDefaults 不保存

无法保存到 iOS 7.0.2 上的 NSUserDefaults

NSUserDefaults 在导航时不保存

使用 NSUserDefaults 杀死应用程序后保存的数据丢失

NSUserDefaults 没有正确保存