NSUserDefaults同步不保存
我有一个测试人员提交的错误,如果他执行一个动作,然后重新启动他的手机(通过按下主页和睡眠/唤醒按钮几秒钟)应用程序不是持久状态。
我已经能够重现这个问题。 [NSUserDefaults synchronize]正在调用,但是当我在重新启动后重新启动应用程序时,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 standardUserDefaults]对象的引用,因为nsdefault是一个单例类,所以如果你可能已经引用了[NSUserDefaults standardUserDefaults]
,之前调用它的那个将会有它尝试从第一个引用完成它,让实例从那里释放,然后在你的其他类调用实例并希望同步完成
在我的例子中,我写给NSUserDefaults的一些值确实存在,而有些则没有。 经过大量的搜索,我注意到没有保存的键值对有一个被称为密钥的键,即TheKey vs theKey。 当我将我的密钥更改为camel-cased密钥(key而不是TheKey)时,该值确实通过app退出并重新启动。 对我来说这似乎很奇怪,但它在我的情况下起作用。