【发布时间】:2015-06-27 19:01:14
【问题描述】:
我正在尝试将几个级别的高分存储在 NSMutableArray 中,然后将其保存在 Documents 文件夹中的文件中。我知道我可以使用 plist,但我不希望用户修改内容。 NSMutableArray *hiscore 似乎没有被初始化,我不知道如何解决这个问题。对于基元来说,这似乎很好,但对于对象,它就不起作用了。
GameData.h
@interface GameData : NSObject <NSCoding>
@property (assign, nonatomic) int level;
@property (assign, nonatomic) NSMutableArray *hiscore;
+(instancetype)sharedGameData;
-(void)save;
-(void)reset;
@end
GameData.m
#import "GameData.h"
@implementation GameData
static NSString* const GameDataLevelKey = @"level";
static NSString* const GameDataHiscoreKey = @"hiscore";
- (instancetype)initWithCoder:(NSCoder *)decoder {
self = [self init];
if (self) {
_level = [decoder decodeDoubleForKey: GameDataLevelKey];
_hiscore = [decoder decodeObjectForKey:GameDataHiscoreKey];
}
return self;
}
+ (instancetype)sharedGameData {
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [self loadInstance];
});
return sharedInstance;
}
+(instancetype)loadInstance {
NSData* decodedData = [NSData dataWithContentsOfFile: [GameData filePath]];
if (decodedData) {
GameData* gameData = [NSKeyedUnarchiver unarchiveObjectWithData:decodedData];
return gameData;
}
return [[GameData alloc] init];
}
-(void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeDouble:self.level forKey: GameDataLevelKey];
[encoder encodeObject:self.hiscore forKey:GameDataHiscoreKey];
}
+(NSString*)filePath {
static NSString* filePath = nil;
if (!filePath) {
filePath =
[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
stringByAppendingPathComponent:@"gamedata"];
}
return filePath;
}
-(void)save {
NSData* encodedData = [NSKeyedArchiver archivedDataWithRootObject: self];
[encodedData writeToFile:[GameData filePath] atomically:YES];
/*[_hiscore writeToFile:[GameData filePath] atomically:YES];*/
}
-(void)reset {
self.level = 0;
}
@end
LevelScene.m
#import "GameData.h"
...
[[[GameData sharedGameData] hiscore] addObject:@1500];
[[GameData sharedGameData] save];
【问题讨论】:
标签: objective-c macos save