NSUserDefaults没有保存

时间:2014-02-19 00:09:32

标签: ios nsuserdefaults sprite-kit

我在我的精灵工具包应用中遇到问题,我的NSUserDefaults变量无效。在createSceneContents(我知道被称为)

if (![defaults objectForKey:@"obj"]) {
    difficultyLabel.text = @"Difficulty: Easy";
    [defaults setObject:@"Easy" forKey:@"obj"];
} else {
    difficultyLabel.text = [NSString stringWithFormat:@"Difficulty: %@", [defaults objectForKey:@"diff"]];
}

然后当您点击SKLabelNode更改难度并且正在调用此代码时

if ([label.text isEqualToString:@"Difficulty: Easy"]) {
            label.text = @"Difficulty: Hard";
            [defaults setObject:@"Hard" forKey:@"obj"];
            NSLog(@"%@",[defaults objectForKey:@"obj"]);

        } else {
            label.text = @"Difficulty: Easy";
            [defaults setObject:@"Easy" forKey:@"obj"];
            NSLog(@"%@",[defaults objectForKey:@"obj"]);

但是当我停止程序并再次运行时,它总是说难度:容易。有什么建议吗?

5 个答案:

答案 0 :(得分:17)

正如rmaddy的回答所解释的那样,NSUserDefaults不会立即将数据写入长期存储。

当您致电setObject:forKey:时,这些值会保存在临时存储器中,因此如果您尝试在objectForKey:之后调用setObject:forKey:,则会在内存中返回该值(如果存在),并且如果没有,它会查找已保存到长期存储中的内容。

在后台,设备最终会将这些值保存到永久存储中。它是操作系统处理的东西,但是在应用程序的正常操作中,大多数时候没有必要立即将这些值存储到永久存储器中,所以让操作系统有时会在优化时执行此操作(I想象一下,操作系统可能会在一些固定的时间表上同时同步每个应用程序的用户默认值,并尽可能尝试在处理器空闲时执行此操作。

但话虽如此,正如rmaddy解释的那样,如果你有一些关键的东西需要立即保存到永久存储器中,你可以随时拨打synchronize。请记住......只要您的应用程序在调试模式下没有被杀死,您设置为存储在用户默认值中的值将被存储。

但是,就你自己而言,如果你想绝对肯定,你可以在synchronize中给applicationDidEnterBackground打个电话,正如rmaddy建议的那样。但请记住,如果您终止应用程序,则不会调用此方法。

答案 1 :(得分:13)

当你说“停止程序”时,你的意思是什么?你是在调试器中运行并杀死应用程序并再次重新运行它? NSUserDefaults不会立即保留您的更改。在撰写重要数据后调用[defaults synchronize]或至少将此类调用添加到您的应用代理的applicationDidEnterBackground方法。然后确保在杀死它之前将应用程序置于后台以确保首先写入数据。

答案 2 :(得分:1)

存储:

NSString * str = @"name123";
NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
[def setObject:str forKey:@"Key"];
[def synchronize];
NSLog(@"str = = %@",str);

要检索:

NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
NSString *str2 = [def valueForKey:@"Key"];
NSLog(@" Saved str  = = %@",str2);

答案 3 :(得分:0)

我发现NSUserDefaults没有保存的另一个原因,下面的代码可以在NSUserDefaults中保存值而不保存:

NSUserDefaults *def= [[NSUserDefaults standardUserDefaults] init];
...
NSUserDefaults *def= [[NSUserDefaults standardUserDefaults] initWithSuiteName:@"123"];

您可以在项目中搜索NSUserDefaults以捕获那些init两次错误。

答案 4 :(得分:0)

我之前遇到过这个问题,但后来没有了。我想不通。

结果是重新启动我的 mac 修复了它。在后台运行的 prefsd 守护进程肯定存在一些问题,我猜可能会导致这种情况