NSUserDefaults值定期丢失

时间:2014-05-03 11:42:29

标签: ios iphone objective-c nsuserdefaults

我使用[NSUserDefaults standardDefaults]来存储布尔值以查看它是否是第一次启动应用程序...如果是这样,应用程序应显示注册窗口。

  • 直到上周工作正常,但现在,有时当我切换到其他应用程序并在一段时间后回来时,我看到注册页面加载而不应该加载。

  • 我使用NSLog来查看[NSUserDefaults standardDefaults]中存储的内容,并且我发现我存储的值已设置为nil (null),而我在任何地方都没有这样做我的代码。

有谁知道为什么值会重置?

PS:实际上这些值并没有永久丢失,因为如果我在注册页面中没有做任何事情而退出应用程序,它会在我下次进入应用程序时正常启动!! !

4 个答案:

答案 0 :(得分:1)

很久以前我遇到过这个问题,结果我正在使用的第三方库在将值存储到NSUserDefaults时使用相同的密钥。尝试在项目中搜索此密钥,也许还有其他东西正在重置它。

答案 1 :(得分:1)

以下是我在NSUserDefaults中按照可能性的顺序丢失值的方法:

  1. 钥匙从未保存在首位
  2. 您的应用稍后会将其删除
  3. 该应用已删除并重新安装
  4. 另一个应用程序覆盖或删除密钥
  5. 手机或模拟器已重置
  6. 在夜间,手机被一部外观相同的手机取代
  7. 从这里的讨论中可以看出,你排除了1,2,4,可能是3& 5.我能想到的唯一下一个调试步骤是将测试手机始终存放在锁定的抽屉中。

    但我会把钱留在导致#1的间歇性问题上。为此,我们需要发布代码进行调查。

    编辑 -

    此处发布的NSUserDefaults个问题的高百分比是关于存储BOOL和其他标量类型。看起来OP知道包装在NSNumbers中,但BOOLS尤其令人担忧,因为很容易混淆false-y值,如NO no和nil,以及NSNull实例。

    让我们把这个问题列在#2.5的问题清单上。再次,需要代码来确认。

答案 2 :(得分:1)

如果在测试时发生这种情况,那是正常的。程序甚至做出这个决定的事实(我应该显示注册页面吗?)表明应用程序已被强行退出并从头开始。在测试时,这会导致在从Xcode重新加载应用程序时清除应用程序沙箱。然而,在真实用户的现实生活中,这种情况不会发生(除非用户从设备中删除应用程序)。

答案 3 :(得分:0)

确保在设置[[NSUserDefaults standardUserDefaults] synchronize]后立即致电preferences并且您没有覆盖您的偏好。