0

私は幻覚を起こしていると思います。Concentration-lkeゲームに永続性を追加しようとしています。ハイスコ​​アを追跡したいと思います。私はこれを今日しばらくの間部分的に機能させました、そして今それはすべてkablooieになりました(私はそれが正しいiOS用語だと思います)。これで、allHighScoresNSMutablearrayが突然CALayerになりました。NSKeyedArchivingを使用しています。allHighScoresにデータが読み込まれる前に、ファイルにブレークポイントがあります。アプリケーションをステップスルーすると、allHighScoresはNSMutableArrayとして存在します。次のステップで、突然CAレイヤーになります。は?

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

更新:「highscores.archive」ファイルがすでに存在し、保存が再度呼び出されると、プログラムがクラッシュします。私はアプリを起動し、ハイスコアを見ることができます-それらはそこにあり、幸せに取得されますが、コードを保存します:

-(BOOL)saveHighScores {
NSString *path = [self flipScoreArchivePath];
return [NSKeyedArchiver archiveRootObject:allHighScores toFile:path];}

EXC_BAD_ACCESSを引き起こします。パスは正しいので、どういうわけかallHighScoresは正しくありません。

4

2 に答える 2

2

ここでの問題は、アーカイブ解除の結果を保持していないことです。基本メモリ管理ルールに従って、という名前のメソッド+unarchiveObjectWithFile:は自動解放されたオブジェクトを返します。そのため、ivarに配置するため、このオブジェクトを保持する必要があります。そうしないと、下から割り当てが解除されます。

あなたの場合、可変配列が必要なので、実際には呼び出す必要があります。これは、不変配列を提供するだけだ-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])) {
于 2012-04-29T21:17:36.547 に答える
-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;
}

編集/更新: つまり、上記の例で実際に意図したものの2つのバージョンがあります(ここでは、彼のivarallHighScoresに対応するプロパティがあると想定しています)。

-(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;
}
于 2012-04-30T02:17:17.867 に答える