我想我是幻覺。我正在努力爲我的Concentration-lke遊戲添加一些持久性。我想跟蹤高分。今天我已經部分工作了一段時間,現在它已全部結束了kablooie(我認爲這是正確的iOS術語)。現在,我的所有高分榜NSMutablearray突然變成了CALayer。我正在使用NSKeyed歸檔。在所有HighScores都加載數據之前,我在文件中有一個斷點。在單步執行應用程序時,allHighscores將以NSMutableArray的形式存在 - 然後,在下一步中,它突然變爲CA層。咦?我的NSMutableArray突然變成CALayer
-(id)init
{
self = [super init];
if (self) {
NSString *path = [self flipScoreArchivePath];
NSLog(@"Path is %@", path);
allHighScores = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if (!allHighScores) {
allHighScores = [[NSMutableArray alloc] init];
}
}
return self;
}
+(FlipHighScoreStore *)sharedStore {
static FlipHighScoreStore *sharedStore = nil;
if (!sharedStore) {
sharedStore = [[super allocWithZone:nil]init];
}
return sharedStore;
}
不知何故,調用NSKeyedUnarchiver將我的allHighScores從NSMutableArray更改爲CALayer。我很困擾。
我嘗試在取消存檔指令中添加一個保留,但這並沒有幫助。
這裏是我的編碼/解碼代碼:
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.themeChosen forKey:@"themeChosen"];
[aCoder encodeInt:self.highScore forKey:@"highScore"];
[aCoder encodeInt:self.scoreStartLevel forKey:@"scoreStartLevel"];
[aCoder encodeInt:self.scoreFinishLevel forKey:@"scoreFinishLevel"];
[aCoder encodeObject:scoreDateCreated forKey:@"scoreDateCreated"];}
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self) {
self.themeChosen = [aDecoder decodeObjectForKey:@"themeChosen"];
self.highScore = [aDecoder decodeIntForKey:@"highScore"];
self.scoreStartLevel = [aDecoder decodeIntForKey:@"scoreStartLevel"];
self.scoreFinishLevel = [aDecoder decodeIntForKey:@"scoreFinishLevel"];
scoreDateCreated = [aDecoder decodeObjectForKey:@"scoreDateCreated"];
}
return self;}
UPDATE:當「highscores.archive」文件已經存在並且保存再次調用程序崩潰。我可以啓動應用程序,看看高分 - 他們在那裏,並愉快地恢復,但節省代碼:
-(BOOL)saveHighScores {
NSString *path = [self flipScoreArchivePath];
return [NSKeyedArchiver archiveRootObject:allHighScores toFile:path];}
導致EXC_BAD_ACCESS。路徑是正確的,所以allHighScores不知道怎麼做。
您使用ARC嗎? – joerick
你能告訴我們你如何在FlipHighScore中實現NSCoding協議,或者是什麼類名? – mbm29414
試試這個'NSLog(@「unarchived class%@」,NSStringFromClass([allHighScores class]));'並記下輸出。 – CodaFi