6

我有 NSUserDefaults 的问题,我不太明白发生了什么。

我的应用程序有 5 个级别,每个级别与 NSUserDefaults 执行完全相同的操作(检索级别默认值,在用户播放级别时更改值,然后设置默认值并在级别结束时同步)前 4 个级别。工作顺利,但最后一级不保存值。应用程序不会崩溃,最后一级也不是最后发生的事情,我什至在应用程序终止时同步了默认值。NSUserDefaults 上是否有最大大小,或者有没有人能想到我没有的任何东西,我将在下面发布代码,但就像我说的前四个级别工作得很好

//header
NSUserDefaults *userData;


@property(nonatomic,retain) NSUserDefaults *userData;


//class file
//Sets the boolean variables for the class to use
userData = [NSUserDefaults standardUserDefaults];
boolOne = [userData boolForKey:@"LevelFiveBoolOne"];
boolTwo = [userData boolForKey:@"LevelFiveBoolTwo"];
boolThree = [userData boolForKey:@"LevelFiveBoolThree"];
boolFour = [userData boolForKey:@"LevelFiveBoolFour"];
boolFive = [userData boolForKey:@"LevelFiveBoolFive"];
boolSix = [userData boolForKey:@"LevelFiveBoolSix"];
boolSeven = [userData boolForKey:@"LevelFiveBoolSeven"];

//End Of Level
[userData setBool:boolOne forKey:@"LevelFiveBoolOne"];
[userData setBool:boolTwo forKey:@"LevelFiveBoolTwo"];
[userData setBool:boolThree forKey:@"LevelFiveBoolThree"];
[userData setBool:boolFour forKey:@"LevelFiveBoolFour"];
[userData setBool:boolFive forKey:@"LevelFiveBoolFive"];
[userData setBool:boolSix forKey:@"LevelFiveBoolSix"];
[userData setBool:boolSeven forKey:@"LevelFiveBoolSeven"];
[userData synchronize];

当我切换到使用这些默认值的视图时,它们的值是正确的,但是当我终止应用程序并重新启动它时,这些值不会被保存,每个其他级别都会执行完全相同的过程,这是唯一不起作用的级别.

我已经盯着这个看了很长一段时间,我希望有人遇到同样的问题,并且可以让我了解他们是如何解决它的。

4

4 回答 4

13

NSUserDefaults 可能没有机会保存,具体取决于进程的终止方式。

这个答案有更多信息:为什么 NSUserDefaults 不保存我的值?

于 2010-04-13T05:10:45.503 回答
4

以防万一有人遇到这种情况:当在用户默认值中存储NSDictionaryNSArray(或两者的可变对象)并且他们存储了NSURL对象时,它不会在同步时保存数据!

于 2012-08-17T07:39:09.820 回答
2

在某处你有类似的东西:

// load the default values for the user defaults
userDefaultsValuesPath=[[NSBundle mainBundle] pathForResource:@"UserDefaults" ofType:@"plist"];
userDefaultsValuesDict=[NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath];

// set them in the standard user defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];

如果您设置的初始默认值没有 LevelFive 默认值,则调用将失败。

检查 -synchronize 的返回值是否有错误。

于 2009-09-14T04:32:37.580 回答
0

我决定把这个问题放在一边,继续开发,包括在第五级之后添加东西,这样用户就可以循环通过关卡并返回主菜单等等......我不知道为什么,但 userDefaults 是现在保存到第 5 级,所以我不知道是不是因为在第 5 级之前是应用程序所做的最后一件事,即使它没有自行终止并做了其他事情,也可能实际上并没有将默认值写入磁盘。 ..我仍然不确定出了什么问题,但它现在正在工作,我不能让它失败,看看我是否会在同步时出错......

谢谢您的帮助

于 2009-09-14T05:39:07.343 回答