NSUserDefaults 不保存

Posted

技术标签:

【中文标题】NSUserDefaults 不保存【英文标题】:NSUserDefaults not saving 【发布时间】:2014-02-19 00:09:31 【问题描述】:

我的 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"]);

但是当我停止程序并再次运行它时,它总是只显示难度:简单。有什么建议吗?

【问题讨论】:

【参考方案1】:

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

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

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

话虽如此,正如 rmaddy 解释的那样,如果您有一些急需立即保存到永久存储中的东西,您可以随时致电synchronize。但请记住...只要您的应用在调试模式下没有被终止,您设置为存储在用户默认值中的值就会被存储。

但是为了您自己,如果您想绝对确定,您可以按照 rmaddy 的建议在applicationDidEnterBackground 中调用synchronize。但请记住,如果您终止应用,则不会调用此方法。

【讨论】:

关于调试模式的评论怎么强调都不过分。我坐在这里试图弄清楚为什么我的默认值没有被正确设置,因为我不知道缓存正在进行。【参考方案2】:

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

【讨论】:

谢谢。使用 [默认同步] 其工作正常【参考方案3】:

存储:

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

【讨论】:

【参考方案4】:

我发现 NSUserDefaults 不保存的另一个原因,以下代码可以在 NSUserDefaults 不保存中产生价值:

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

您可以在您的项目中搜索NSUserDefaults 以捕获那些初始化两次错误。

【讨论】:

谢谢,这正是我的情况!【参考方案5】:

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

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

【讨论】:

以上是关于NSUserDefaults 不保存的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSDictionary 保存到 NSUserDefaults 不保存值

NSUserDefaults 不保存数据。限制?

NSUserDefaults 并不总是保存我的 NSString 数据

NSUserDefaults 在导航时不保存

将UIColor保存到NSUserDefaults并从NSUserDefaults加载

NSUserDefaults 没有正确保存