NSUserDefaults standardUserDefaults如何工作?

时间:2010-10-19 01:48:08

标签: ios4 savestate

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

我在[[NSUserDefaults standardUserDefaults] setObject:self.listData forKey:@"listData"];applicationDidEnterBackground:方法中使用applicationWillTerminate:保存了一些州。我使用NSMutableArray *listData = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"listData"]];方法中的viewDidLoad检索了数据。

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

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

所以我想知道[NSUserDefaults standardUserDefaults]在iOS4.0中是如何工作的?如何在iOS4.0中使用它来保存一些数据?很多人!

2 个答案:

答案 0 :(得分:2)

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

  1. 每一定时间(未知?)的时间
  2. 当您致电[NSUserDefaults synchronize]
  3. 如果您在前往bg的途中保存了首选项,则以上都不适用,因此不会保存首选项。

答案 1 :(得分:2)

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

实际上你的程序可能正常。真正的问题是从多任务栏中删除应用程序并不会调用所有的应用程序退出函数,它只是杀死了进程,就像OSX中的强制退出一样(实际上可能就像强制退出一样)。

您的应用程序在没有多任务处理的情况下工作,因为默认值是用applicationWillTerminate编写的,然后在正常退出过程中为您调用[NSUserDefaults synchronize]。

如果您希望自己的偏好在用户启动强制退出后继续存在,则应在更改时写下默认值,并将同步调用放入applicationDidEnterBackground