1

[NSUserDefaults standardUserDefaults]在 iOS4.0 中遇到了问题。

我通过使用[[NSUserDefaults standardUserDefaults] setObject:self.listData forKey:@"listData"];inapplicationDidEnterBackground:applicationWillTerminate:方法保存了一些状态。我通过NSMutableArray *listData = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"listData"]];viewDidLoad方法中使用来检索数据。

我正在使用 sdk4.1 和模拟器进行测试。问题是:当我的应用程序进入后台时,它确实调用了 save 方法。因为我想知道它是否真的被保存了,所以我双击主页按钮调用多任务堆栈并按住主页按钮,然后使用减号图标在后台杀死我的应用程序。然后我再次进入应用程序,但实际上并没有保存数据。

然后我在 info.plist 中选择属性应用程序不在后台运行以查看它是否在 iOS3.0 中工作。当我点击主页按钮时,它调用了保存方法,然后我进入应用程序,数据已成功保存。

所以我想知道[NSUserDefaults standardUserDefaults]iOS4.0的工作原理是什么?我怎么可能通过在 iOS4.0 中使用它来保存一些数据?很多谢谢!

4

2 回答 2

2

更具体地说 - [NSUserDefaults standardUserDefaults]是指向闪存上的默认文件副本的指针,而不是默认文件本身。当您进行更改时,您只是在修改这个临时副本。[NSUserDefaults synchronize]它仅在被调用时才写入闪存。您应该在程序退出时调用它。

实际上,您的程序可能运行良好。真正的问题是,从多任务栏中终止应用程序并不会调用所有应用程序退出函数,它只是终止进程,就像 OSX 中的强制退出(实际上可能与强制退出完全一样)。

您的应用程序无需多任务处理即可工作,因为写入默认值applicationWillTerminate,然后在正常退出过程中为您调用 [NSUserDefaults synchronize]。

如果您希望您的首选项在用户发起的强制退出后仍然存在,您应该在更改它们时写入您的默认值,并将同步调用放入applicationDidEnterBackground

于 2010-10-19T02:13:37.450 回答
2

不要那样做。我的意思是不要在去 bg 之前保存首选项,因为它什么都不做。实际上,您应该阅读规格。nsuserdefaults 在两种不同的情况下为您保存首选项:

  1. 每个特定(未知?)的时间
  2. 当你调用 [NSUserDefaults 同步]

如果您在前往 bg 的途中保存您的首选项,则上述都不适用,因此首选项不会被保存。

于 2010-10-19T02:04:26.263 回答