NSUserDefaults不能正确保存

6

我在使用NSUserDefaults时遇到了问题,但我并不太明白发生了什么。

我的应用有5个级别,每个级别都使用NSUserDefaults执行完全相同的操作(检索级别默认值,在用户玩完级别时更改值,然后设置默认值并进行同步),前4个级别没有任何问题,但是最后一个级别无法保存值。应用程序不崩溃,并且最后一个级别不是发生的最后一件事情,而且当应用程序终止时,我甚至已经同步了默认值。NSUserDefault是否有最大大小,或者是否有任何人可以想到我没想到的东西?我将在下面发布代码,但像我所说的,前四个级别完美地工作。

//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];

当我切换到使用这些默认值的视图时,这些值是正确的,但当我终止应用程序并重新启动它时,这些值不会保存。其他每个级别都执行相同的过程,只有这个级别无法正常工作。
我已经仔细检查了很长时间,希望有人也遇到过同样的问题,并能给我一些解决方案的见解。

很难根据您发布的内容判断。请再次检查保存级别后的默认方法。 - Jordan
4个回答

13

4

如果有人遇到这种情况:在用户默认设置中存储一个 NSDictionaryNSArray (或两者都是 mutable 对象) 并且其中包含一个 NSURL 对象,那么在同步时不会保存数据!


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的返回值是否有错误。

0

我决定先搁置这个问题,继续开发,包括在第五关之后添加功能,使用户可以循环通过各个关卡并返回主菜单等等...不过我不确定为什么现在用户默认设置已经保存到了第五关,可能是因为在第五关之前应用程序做的最后一件事情,即使它没有终止自己并且做了其他的事情,也许它实际上并没有将默认设置写入磁盘...我仍然不确定出了什么问题,但现在它已经可以工作了,我无法让它失败以查看是否可以通过同步来获取错误...

感谢您的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接