无法在单例中设置长值 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() 中获取。
为确保没有游戏数据文件,您应该重置模拟器或从设备中删除该应用程序,然后重试。
我在设置和访问 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() 中获取。
为确保没有游戏数据文件,您应该重置模拟器或从设备中删除该应用程序,然后重试。