Ios 不保存默认值

Ios 不保存默认值,ios,nsuserdefaults,sprite-kit,Ios,Nsuserdefaults,Sprite Kit,我的sprite kit应用程序出现问题,其中我的NSUserDefaults变量不起作用。在createSceneContents中(我知道正在调用它) 然后单击SKLabelNode更改难度时,将调用此代码 if (![defaults objectForKey:@"obj"]) { difficultyLabel.text = @"Difficulty: Easy"; [defaults setObject:@"Easy" forKey:@"obj"]; } else {

我的sprite kit应用程序出现问题,其中我的
NSUserDefaults
变量不起作用。在
createSceneContents
中(我知道正在调用它)

然后单击
SKLabelNode
更改难度时,将调用此代码

if (![defaults objectForKey:@"obj"]) {
    difficultyLabel.text = @"Difficulty: Easy";
    [defaults setObject:@"Easy" forKey:@"obj"];
} else {
    difficultyLabel.text = [NSString stringWithFormat:@"Difficulty: %@", [defaults objectForKey:@"diff"]];
}
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"]);

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

当你说“停止程序”时,你是什么意思?您是否正在调试器中运行并终止应用程序,然后再次运行它<代码>NSUserDefaults不会立即保留更改。在写入重要数据后调用
[defaults synchronize]
,或者至少将这样的调用添加到您的应用程序代理的
applicationIdentinterbackground
方法中。然后确保在关闭应用程序之前将其置于后台,以确保先写入数据。

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

当您调用
setObject:forKey:
时,这些值保存在临时内存中,因此如果您尝试在
setObject:forKey:
之后调用
objectForKey:
,它将返回内存中的值(如果存在),如果不存在,它将查找保存到长期存储中的内容

在后台,设备最终会将这些值保存到永久存储器中。这是操作系统处理的事情,但在应用程序的正常运行中,大多数时候不必立即将这些值存储到永久存储器中,因此,当操作系统进行了优化时,让操作系统执行此操作(我想操作系统可能会按照一定的时间表同步每个应用程序的用户默认值,并尽可能在处理器空闲时尝试同步)

但是,正如rmaddy所解释的那样,如果你有一些非常重要的东西需要立即保存到永久存储器中,你可以随时调用
synchronize
。但是请记住……只要你的应用程序在调试模式下没有被杀死,你设置为存储在用户默认值中的值就会被存储

但是为了您自己的利益,如果您想绝对确定,您可以按照rmaddy的建议,在
ApplicationIdentinterBackground
中调用
synchronize
。但是请记住,如果您关闭应用程序,则不会调用此方法。

要存储:

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);

我找到了NSUserDefaults不保存的另一个原因,以下代码可以使NSUserDefaults中的值不保存:

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

您可以在项目中搜索
NSUserDefaults
,以捕获那些init tweep bug。

我以前遇到过这个问题,但后来没有。我无法解决它


结果是重新启动我的mac解决了这个问题。在后台运行的prefsd守护进程一定有问题,我猜可能是这个问题造成的。

谢谢。使用[Default synchronize]它的工作很好关于调试模式的评论再强调也不为过。我坐在这里试图弄清楚为什么我的默认值设置不正确,因为我没有意识到缓存正在进行。谢谢,这正是我的情况!