2012-04-29 64 views
0

我想我是幻覺。我正在努力爲我的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不知道怎麼做。

+0

您使用ARC嗎? – joerick

+0

你能告訴我們你如何在FlipHighScore中實現NSCoding協議,或者是什麼類名? – mbm29414

+0

試試這個'NSLog(@「unarchived class%@」,NSStringFromClass([allHighScores class]));'並記下輸出。 – CodaFi

回答

2

這裏的問題是你沒有保留unarchiving的結果。根據Basic Memory Management Rules,名稱爲+unarchiveObjectWithFile:的方法將返回一個自動釋放對象。因此,由於您將它放入伊娃,因此您需要保留這個對象,否則它將從您的下方被釋放。

雖然你的情況,因爲你想可變數組,你實際上需要調用-mutableCopy因爲NSKeyedUnarchive只會給你一個不可改變的陣列。

-(id)init { 
    if ((self = [super init])) { 
     NSString *path = [self flipScoreArchivePath]; 
     NSLog(@"Path is %@", path); 
     allHighScores = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] mutableCopy]; 
     if (!allHighScores) { 
      allHighScores = [[NSMutableArray alloc] init]; 
     } 
    } 
    return self; 
} 

-initWithCoder:不調用超。您需要說

if ((self = [super initWithCoder:aDecoder])) { 
+0

謝謝!我添加了保留,並沒有改變行爲。自從我使用ARC後,我不認爲我需要保留。 –

+0

@ AugustusS-R:啊,我不知道你在使用ARC。如果你想要一個可變數組,你仍然需要'-mutableCopy'。 –

+0

謝謝你的想法,凱文! allHighScores仍然成爲一個CALayer(這顯然是一件壞事...) –

-3

您是否試過這個?

-(id)init { 
    if ((self = [super init])) { 
     NSString *path = [self flipScoreArchivePath]; 
     NSLog(@"Path is %@", path); 
     allHighScores = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] mutableCopy]; 
     if (!allHighScores) { 
      allHighScores = [[NSMutableArray alloc] init]; 
     } 
     // All-important new line.... 
     [self setAllHighScores:allHighScores]; 
    } 
    return self; 
} 

編輯/更新: 所以,這裏是什麼,我確實打算在上面的例子中(我假設在這裏,他的伊娃allHighScores有相應的屬性)兩個版本:

-(id)init { 
    if ((self = [super init])) { 
     NSString *path = [self flipScoreArchivePath]; 
     NSLog(@"Path is %@", path); 
     self.allHighScores = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] mutableCopy]; 
     if (!self.allHighScores) { 
      self.allHighScores = [[NSMutableArray alloc] init]; 
     } 
    } 
    return self; 
} 

這是我真正做到這一點的方式:

-(id)init { 
    if ((self = [super init])) { 
     NSMutableArray *arr = [[NSKeyedUnarchiver unarchiveObjectWithFile:[self flipScoreArchivePath]] mutableCopy]; 
     if (!arr) arr = [[NSMutableArray alloc] init]; 
     [self setAllHighScores:arr]; 
    } 
    return self; 
} 
+2

最好的貨物崇拜編程。分配給伊娃,然後調用同一個setter?這是沒有意義的。 –

+0

迴歸自我;也失蹤了。 – MrMage

+0

當然,除非他使用ARC,否則該對象不會被簡單地分配給伊娃。他有一個奇怪的問題。我想確保我們檢查了所有的基礎知識。感謝大家誰投了一個誠實的嘗試幫助!你對自己感覺更好嗎? – mbm29414