使用 NSUserDefaults 保存高分时出错

Posted

技术标签:

【中文标题】使用 NSUserDefaults 保存高分时出错【英文标题】:Error saving high score using NSUserDefaults 【发布时间】:2014-03-05 16:05:33 【问题描述】:

我正在使用 SpriteKit 制作游戏。我第一次输掉比赛,高分是0(好)。然后,我保存当前分数。下次我玩的时候,高分是一个很大的数字,例如 366508176。为什么会发生这种情况以及如何解决它?

这是 ScoreScene.m 文件,它的超类是 SKScene。 [GameScene getScore] 是返回最后得分的静态函数。

//
//  ScoreScene.m
//

#import "ScoreScene.h"
#import "GameScene.h"
@interface ScoreScene()
@property BOOL contentCreated;
@end

@implementation ScoreScene
-(void)didMoveToView:(SKView *)view

    if (!self.contentCreated) 
        [self createSceneContents];
        self.contentCreated=YES;
    


-(void)createSceneContents

    self.backgroundColor=[SKColor purpleColor];
    self.scaleMode=SKSceneScaleModeAspectFill;


    NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
    int highScore=(int)[userDefaults objectForKey:@"HighScore"];
    //highScore is 0 the first time, 366508176 the second 

    int currentScore=[GameScene getScore];
    //currentScore is 3, for example
    if (currentScore>highScore) 

        [userDefaults setInteger:currentScore forKey:@"HighScore"];
        [userDefaults synchronize];
        highScore=currentScore;
    
    [self addChild:[self newHighScoreLabel:highScore]];
    [self addChild:[self newScoreLabel]];
    [self addChild:[self newStartLabel]];



...




@end

【问题讨论】:

【参考方案1】:

代替:

int highScore=(int)[userDefaults objectForKey:@"HighScore"];

你需要做的

int highScore = [userDefaults integerForKey:@"HighScore"];

【讨论】:

有效!! objectForKey 是内存地址还是类似的东西? ObjectForKey 是当你在那里写一个对象时 - 例如你可以将你的分数保持为 NSNumber,而不是使用 objectForKey【参考方案2】:

设置:

[[NSUserDefaults standardUserDefaults] setInteger:highScore forKey:@"HighScore"]

获取:

[[NSUserDefaults standardUserDefaults] integerForKey:@"HighScore"]

【讨论】:

3 月 5 日 16:07 — 接受的答案,3 月 5 日 16:13 — 我的答案,你的问题是什么?【参考方案3】:

或者,在 NSNumbers 中“包装”标量更通用一点,这会给你:

[defaults setObject:[NSNumber numberWithInt:highScore] forKey:@"HighScore"];

int HighScore = [[defaults objectForKey:@"HighScore"] intValue];

这样做的好处是现在可以轻松地将对象放入集合中、传递通知等。

【讨论】:

以上是关于使用 NSUserDefaults 保存高分时出错的主要内容,如果未能解决你的问题,请参考以下文章

xcode swift:NSUserDefaults:如果退出应用程序,则保存高分并在停止的地方重新启动它

phpstrom 保存js或css出错,提示视图保存文件时发生以下错误! 急求帮助!高分悬赏!

NSUserDefaults 在导航时不保存

告诉程序找不到保存数据时该怎么办 NSUserDefaults, iPhone

应用退出时如何确保 NSUserDefaults 设置保存到磁盘?

保存到 NSUserDefaults 的字典总是返回 nil