NSUserDefaults同步不保存

Dan*_* T. 9 nsuserdefaults ios

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

我已经能够重现这个问题.[同步NSUserDefaults的] 获取调用,但是当我在重新启动后重新启动应用程序,NSUserDefaults的里面的价值没有被保存.

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

(编辑)换句话说:

assert([[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO);
[[NSUserDefaults standardUserDefaults] setBool: YES forKey: MY_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)

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

非常具体......我创建了一个单独的视图应用程序,并将以下代码放在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.");
}
Run Code Online (Sandbox Code Playgroud)

以下是该应用程序的三次运行的输出:

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.
Run Code Online (Sandbox Code Playgroud)

请注意,输出为"是,否,否"但它应该是"是,否,是"

小智 2

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