使用 NSUserDefaults 保存/加载数据 (cocos2d iphone)
Posted
技术标签:
【中文标题】使用 NSUserDefaults 保存/加载数据 (cocos2d iphone)【英文标题】:Saving/Loading Data with NSUserDefaults (cocos2d iphone) 【发布时间】:2011-06-11 20:53:26 【问题描述】:我有一个升级场景,用户可以在其中升级游戏的不同属性,我希望保存这些信息。例如,当用户花费 1000 点将 mag 升级 5 时,我希望保存该信息以供下次启动应用程序使用。有人告诉我 NSUserDefaults 是一个很好的方法。这是正确保存/加载 mag int 的正确方法吗?
-(void)plusFiveMag:(id)sender
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:NSNumber numberWithInt:mag forKey:@"mag"];
mag += 5;
-(void)viewDidLoad
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:NSNumber numberWithInt:mag forKey:@"mag"];
【问题讨论】:
【参考方案1】:使用访问器使这一切变得容易得多。使用访问器意味着您永远不必担心 mag
是如何在内部存储的,因此您可以透明地将其存储在 NSUserDefaults
而不是 ivar 中。
@property (nonatomic, readonly, assign) NSUInteger mag;
NSString * const kMagDefaultsKey = @"mag";
- (NSUInteger)mag
return [[NSUserDefaults standardUserDefaults] integerForKey:kMagDefaultsKey];
- (void)setMag:(NSUInteger)value
[[NSUserDefaults standardUserDefaults] setInteger:value forKey:kMagDefaultsKey];
- (void)addFiveToMag:(id)sender
self.mag = self.mag + 5;
【讨论】:
看起来并不比其他方法简单多少。如果我也需要在其他地方使用“mag”,这会起作用吗? 这就是我的意思,它更简单。其他方法迫使您在触摸 mag 的每个地方重复“设置 ivar 并设置 NSUserDefaults”。这种方法将它放在一个地方(访问器)。只要您始终使用“self.mag”,它就会透明地做正确的事情。如果您更改了存储 mag 的方式,则将其固定在一个地方,而不是每个使用 mag 的地方。此外,这消除了在 viewDidLoad 中初始化所涉及的所有时间问题(这可以在对象创建后运行很长时间,并且可以运行多次)。 问题是我在另一个类中创建了 'mag' 作为 int。是否必须更改为 NSNumber,我是否需要做一些特殊的事情才能将其导入此类? NSUInteger 只是一个独立于平台的无符号整数。它不是一个对象。它只是一个 typedef,通常应该使用什么来代替“无符号”。签名的等价物是 NSInteger。如果将上面的“NSUInteger”替换为“int”,它也可以工作。 如何将它从“A”类导入到“B”类?【参考方案2】:这样存储:
-(void)plusFiveMag:(id)sender
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:mag forKey:@"mag"];
mag += 5;
要获得它,您必须使用:
-(void)viewDidLoad
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int mag = [defaults integerforKey:@"mag"];
【讨论】:
这不足以判断错误发生在哪里。不一定使用上面的代码。插入控制台输出。顺便问一下,你如何创建 mag ivar? 这可能是问题所在。我在另一个类的 .h 中创建它。问题是我输入错误,我猜。我@class 上课,然后@property (nonatomic, assign) int mag;
另外将setObject
更改为setInteger
给我一个警告“传递 'setInteger:forKey:' 的参数 1 从指针中生成整数而无需强制转换以上是关于使用 NSUserDefaults 保存/加载数据 (cocos2d iphone)的主要内容,如果未能解决你的问题,请参考以下文章
将UIColor保存到NSUserDefaults并从NSUserDefaults加载
将 UIColor 保存到 NSUserDefaults 并从中加载
UIPickerView 不会显示从 NSUserDefaults 加载的数据