【问题标题】:NSUserDefaults synchronize not saving onNSUserDefaults 同步不保存
【发布时间】:2013-05-27 12:03:52
【问题描述】:

我有一个测试人员提交的错误,如果他执行一个操作然后重新启动他的手机(通过按下主页和睡眠/唤醒按钮几秒钟)应用程序不会保持状态。

我已经能够重现此问题。 [NSUserDefaults 同步] is 被调用,但是当我在重启后重启应用程序时,NSUserDefaults 中的值没有保存。

有人知道是否将存储同步到稍后保存到磁盘的缓冲区吗?如果是这样,我如何刷新缓冲区(我认为同步与刷新相同,但显然不是。)

(编辑) 换句话说:

assert([[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO);
[[NSUserDefaults standardUserDefaults] setBool: YES forKey: MY_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];

调用上述方法后,将应用程序留在前台并重新启动设备,然后重新启动设备并重新运行应用程序。断言应该第二次触发,但有时不会。

具体来说...我创建了一个单视图应用程序并将以下代码放入 viewDidLoad

#define MY_KEY @"MY_KEY"

- (void)viewDidLoad
{
    [super viewDidLoad];
    BOOL key = [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY];
    NSLog(@"[[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == %@", key ? @"YES" : @"NO");
    [[NSUserDefaults standardUserDefaults] setBool: !key forKey: MY_KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"reboot now.");
}

这是应用程序的三个运行的输出:

2013-05-31 12:17:44.127 syncTest[162:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == YES
2013-05-31 12:17:44.133 syncTest[162:907] reboot now.
2013-05-31 12:18:49.771 syncTest[128:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO
2013-05-31 12:18:49.778 syncTest[128:907] reboot now.
2013-05-31 12:19:41.388 syncTest[124:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO
2013-05-31 12:19:41.397 syncTest[124:907] reboot now.

请注意,输出是“YES, NO, NO”,但应该是“YES, NO, YES”

【问题讨论】:

  • 你用哪个事件来调用[NSUserDefaults synchronize]
  • 同步应该可以工作,可能有助于查看一些代码。你是如何设置和获取数据的?
  • 听起来很奇怪,不应该发生。请您在同步的地方发布一些代码。
  • 您在哪里拨打了[NSUserDefaults synchronize]
  • 我向 Apple 提交了错误报告:错误 ID# 14034591。

标签: ios nsuserdefaults


【解决方案1】:

我遇到了同样的问题,我发现我在不同的类上有两个 [NSUserDefaults standardUserDefaults] 对象的引用,因为 nsdefault 是一个单例类,所以如果你可能已经引用了 @ 987654321@ 尝试从第一个引用完成它,让实例从那里释放出来,然后在你的其他类调用实例并希望同步完成

【讨论】:

  • 您会注意到,在我的示例代码中,只有一个类引用了 NSUserDefaults。所以这并不能回答这个问题。如果它对你有用,我很高兴。
  • 在您的示例代码中,它有一个引用,但我告诉您,如果您获得了将 obj 设置为 nil 的 standarduserdefault 对象引用的引用,那么您可能还有其他可能具有相同引用的类,然后使用.. 如果你没有在其他地方使用 userdefault 那么必须看看你到底在做什么
  • 感谢您查看问题,但问题甚至出现在只有一个引用的示例代码中,因此显然问题与多个引用无关。
【解决方案2】:

就我而言,我写给 NSUserDefaults 的一些值确实存在,而有些则没有。经过大量搜索,我注意到没有保存的键值对有一个被大写的键,即 TheKey v.s theKey。当我将密钥更改为驼峰式密钥(theKey 而不是 TheKey)时,该值确实通过应用退出并重新启动而持续存在。为什么会这样在我看来很奇怪,但它在我的情况下有效。

【讨论】:

  • 在上面的示例代码中,显示了问题,关键是完全相同的。
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多