一名测试人员提交了一个错误报告,说如果他执行某个操作然后通过按住主页和睡眠/唤醒按钮重启他的手机,应用程序将无法保留状态。
我已经能够复现这个问题。[NSUserDefaults synchronize] 被调用,但是当我在重启后重新启动应用程序时,NSUserDefaults中的值没有保存。
有人知道synchronize是否会存储到稍后保存到磁盘的缓冲区吗? 如果是这样,我该如何清除缓冲区(我原以为synchronize和flush是相同的,但显然不是)。
(编辑) 换句话说:
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]
方法? - Ric Perrott