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 并不总是保存我的 NSString 数据