使用 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 加载的数据

将带有按钮的 UIScrollview 保存到 NSuserdefaults

复选框保存/加载NSUserdefaults

如何将 MPMediaItemCollection 保存到 NSUSerDefaults?