无法在单例中设置长值 IOS

Trouble setting long value in singleton IOS

我在设置和访问 Singleton 对象的长属性时遇到问题。每次我尝试访问一个 long 属性 它 returns -1.

我的单例接口文件如下:

 @interface gameData : NSObject <NSCoding>
    @property (assign, nonatomic) long score;
    @property (assign, nonatomic) long level;
    @property (assign, nonatomic) long riddlesCompleted;
    @property (assign, nonatomic) long hints;
    @property (assign, nonatomic) long firstLetters;
    @property (assign, nonatomic) long answers;

    +(instancetype)sharedGameData;
    -(void)reset;
    -(void)save;

  @end

然后实现文件设置编码器和解码器如下:

-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeDouble:self.score forKey:gameDataScoreKey];
    [aCoder encodeDouble:self.level forKey:gameDataLevelKey];
    [aCoder encodeDouble:self.riddlesCompleted forKey:gameDataRiddlesCompletedKey];
    [aCoder encodeDouble:self.hints forKey:gameDataHintsKey];
    [aCoder encodeDouble:self.firstLetters forKey:gameDataFirstLettersKey];
    [aCoder encodeDouble:self.answers forKey:gameDataAnswersKey];
}
-(instancetype)initWithCoder:(NSCoder *)decoder{
    self = [self init];
    if (self) {
        _score = [decoder decodeDoubleForKey:gameDataScoreKey];
        _level = [decoder decodeDoubleForKey:gameDataLevelKey];
        _riddlesCompleted = [decoder decodeDoubleForKey:gameDataRiddlesCompletedKey];
        _hints = [decoder decodeDoubleForKey:gameDataHintsKey];
        _firstLetters = [decoder decodeDoubleForKey:gameDataFirstLettersKey];
        _answers = [decoder decodeDoubleForKey:gameDataAnswersKey];
    }
    return self;
}

+(instancetype) sharedGameData{
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [self loadInstance];
    });
    return sharedInstance;
}

值初始化如下:

-(id)init{
    if(self = [super init]){
        _score = 500;
        _riddlesCompleted = 0;
        _level = 1;
        _hints = 3;
        _firstLetters = 3;
        _answers = 3;
    }
    return self;
}

然后加载实例:

+(NSString*)filePath{
    static NSString* filePath = nil;
    if (!filePath) {
        filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) firstObject]
                    stringByAppendingString:@"gameData"];
    }
    return filePath;
}

+(instancetype)loadInstance{
    NSData* decodeData = [NSData dataWithContentsOfFile:[gameData filePath]];
    if (decodeData) {
        gameData* gameData = [NSKeyedUnarchiver unarchiveObjectWithData:decodeData];
        return gameData;
    }
    return [[gameData alloc] init];
}

然后在应用程序的其他地方,当我尝试访问这些值时,我无法访问提示、首字母或答案的值。

如果我尝试按如下方式记录值:

NSLog([NSString stringWithFormat:@"%li", [gameData sharedGameData].score] );
NSLog([NSString stringWithFormat:@"%li", [gameData sharedGameData].hint] );
NSLog([NSString stringWithFormat:@"%li", [gameData sharedGameData].answers]);
NSLog([NSString stringWithFormat:@"%li", [gameData sharedGameData].firstLetters]);

我得到的输出是 500 分,但对于所有其他输出我得到 0,即使它们在 gameData.m 文件中初始化为值 3。

只是一个猜测: 在 loadInstance() 中,您从文件中读取值,因此如果有文件,您将无法在设置值的 init() 中获取。

为确保没有游戏数据文件,您应该重置模拟器或从设备中删除该应用程序,然后重试。