【问题标题】:NSUserDefaults standardUserDefaults objects are being removed randomlyNSUserDefaults standardUserDefaults 对象被随机删除
【发布时间】:2014-07-01 20:29:07
【问题描述】:

我正面临 NSUserDefaults 的一个非常奇怪的行为,问题是 [NSUserDefaults standardUserDefaults] 对象正在被随机删除!

我的 [NSUserDefaults standardUserDefaults] 包含大约 65 个对象(60 个小 NSStrings 和 3 个数组,最大计数可能是 4 和 2 个其他数组,最大计数为 30 ..注意,面对这个问题时,它从来都不是最大的情况) ,其中一个对象是检查用户是否已经完成注册阶段的值。 启动应用程序时,有时这个 NSUserDefaults 将仅包含这 65 个对象中的 5 个对象,而其他对象则从 plist 中删除而不会再次出现,即使我重新启动应用程序也是如此。这会导致用户再次进入注册阶段!!

我很确定我正确使用了保存功能

[[NSUserDefaults standardUserDefaults] setObject:@"Value" forKey:@"Key"]; [[NSUserDefaults standardUserDefaults] synchronize];

我已经在谷歌上搜索过类似的行为,但没有找到任何可以提供帮助的东西! 有没有人遇到过这样的行为,有什么解决办法?

感谢您的帮助

【问题讨论】:

  • 你试过 setObject 而不是 setValue 吗?你有重复的钥匙吗?价值观?
  • 对不起,我更新了我的帖子..我在我的所有项目中都使用 setObject 而不是 setValue..我尝试了一些 setValue 但仍然没有成功。重复键是什么意思?每当我的值被更新时,我都会以相同的键名再次保存它!
  • 在正常情况下检查plist时,所有字段都保存成功,没有任何重复
  • 每次key保存后能打印出nsuserdefaults的内容吗?
  • 它们都已成功保存,因为这些值通过从 NSUserDefault 读取并正常显示在应用程序内部使用。但是当我退出应用程序并在一段时间后重新打开它时,所有这些值都在删除(随机而不是总是)..另外,奇怪的是,当用户打开应用程序并且之前已经进行过注册时,与注册阶段相关的对象没有被更改,那么为什么要删除这些值呢?我检查了只要用户有空间就没有限制保存 NSUserDefault ..所以这个错误让我发疯:S

标签: ios objective-c ios7 nsuserdefaults


【解决方案1】:

我确实想在这里帮忙,因为我的一个项目也有完全相同的奇怪行为。

所以请耐心等待,我的项目发生的事情是:我有一个单例类,它封装了几个属性,并且我为这些属性重写了 setter 和 getter。在 setter 方法中,我获得了 standardUserDefaults 实例并为键设置对象,然后进行同步。在 getter 方法中,我返回键的对象。我还有一个登录成功指示器值来指示登录是否成功。和你的问题一样,我的对象消失了。经过几天的努力,事实证明,当网络无法访问时,登录指示器被初始化为 false。在指示符 false 子句中,我将 nil 对象设置为用户默认值。

我的观点是:

  • 仔细检查standardUserDefaults setObject:forKey:函数调用是否逻辑正确,确保调用时对象NOT nil
  • 检查您是否有使对象无效的逻辑(登录、网络更改等)。
  • 运行测试,找出重现问题的最少步骤。使用调试会话检查对象。 (放弃相信随机消失)

希望这能提供线索。

【讨论】:

  • 另外只想指出,我最后使用KeyChain来保留登录。
  • hi @vladof .. 感谢您的帮助 :) 在 NSUserDefault 中设置对象时,我的对象永远不会为零(我检查了 nsuserdefault 中的每个保存),我不明白第二点,但我的应用程序是始终连接到同一个网络,因为我的连接永远不会丢失..最后我尝试了不可能的尝试来弄清楚如何复制问题..我做了几十次相同的事情,而遵循相同步骤的那个会导致删除对象,这就是为什么我随机称它为..我仍然被困在这个问题上没有任何进展!
  • 当然可以。您可以尝试的技术很少,首先我会编写代码以每半秒左右在 userDefaults 中注销所有对象的规范列表和时间,将日志文件保存在文档目录中,在发生错误后检查日志。其次为什么不找一个合作者向他解释代码,有时我在向别人解释时发现我错了。所以我知道你认为设置 nil 对象没有发生,但我仍然在围栏上。这不太可能是 userDefaults 的错误,99% 的时间是我们的代码问题。选择好的测试用例确实是帮助的关键。
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多