2012-04-29 11 views
0

私は幻覚していると思います。私はConcentration-lkeゲームにいくつかの持続性を追加しようとしています。私は高い得点を記録したいと思います。私はこれを部分的に今日働いているが、今はすべてがkablooieになっている(私は正しいiOSの用語だと思う)。さて、私のallHighScores NSMutablearrayは突然CALayerになります。私はNSKeyedのアーカイブを使用しています。 allHighScoresにデータがロードされる前にファイルにブレークポイントがあります。アプリケーションをステップ実行すると、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; 
} 

、CALayerのにNSMutableArrayのから私のallHighScoresを変更NSKeyedUnarchiverを呼び出します。私は非常に混乱しています。

私はアーカイブ解除命令にretainを追加しようとしましたが、それは助けになりませんでした。

-(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(@アーカイブされていないクラス%@ "、NSStringFromClass([allHighScores class]));'を試して、出力に注意してください。 – CodaFi

答えて

2

ここでの問題は、アーカイブ解除の結果を保持していないことです。 Basic Memory Management Rulesによれば、+unarchiveObjectWithFile:という名前のメソッドは、自動解放されたオブジェクトを返します。したがって、あなたがivarに置くので、あなたはこのオブジェクトを保持する必要があります、またはあなたの下から割り当て解除されます。

あなたは可変配列をしたいので、NSKeyedUnarchiveはちょうどあなたの不変の配列を与えますので、あなたのケースでは、あなたが実際に-mutableCopyを呼び出す必要がありますが。

-(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; 
} 

編集/更新:

だから、ここ(私は彼のIVAR allHighScoresは、対応するプロパティを持っていることを、ここで仮定している)私は実際に上記の例では意図したものの2つのバージョンがあります
-(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

最高級のカーゴ・カルト・プログラミング。 ivarに割り当ててから、同じセッターを呼び出しますか?それは意味をなさない。 –

+0

return self;欠けている。 – MrMage

+0

もちろん、彼がARCを使用しているので、オブジェクトは単にivarに割り当てられるだけでは保持されません。彼は奇妙な問題があります。私はすべての基本を確認したかったのです。ヘルプの正直な試みに投票した皆様に感謝!あなた自身についてもっと気分がいいですか? – mbm29414

関連する問題