0

NSCodingに準拠する「DateTracker」というオブジェクトを作成したので、encodeWithCoderメソッドとinitWithCoderメソッドが含まれています。私がそれを初期化するとき、私は次のように呼びます:

DateTracker *currentTracker = [[DateTracker alloc] initFromFile];

initFromFileメソッドは次のようになります。

- (id)initFromFile { 
    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] attributesOfFileSystemForPath:filePath error:NULL]) {
        NSData *data = [[NSMutableData alloc] initWithContentsOfFile:filePath];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        self = [unarchiver decodeObjectForKey:kDateDataKey];
        [unarchiver finishDecoding];
        [unarchiver release];
        [data release];
    }
    return self;
}

しかし、私が電話しようとすると

[currentTracker release];

アプリがクラッシュします。

パフォーマンスツールを使用してアプリを実行してメモリリークをチェックすると、このオブジェクトを解放していないというメッセージが表示されます。

私が間違っていることについて何か考えはありますか?

4

1 に答える 1

2

この行:

self = [unarchiver decodeObjectForKey:kDateDataKey];

あなたに問題を与えるつもりです。

あなたがしているのは、DateTrackerオブジェクト()を割り当ててから[DateTracker alloc]、新しいDateTrackerオブジェクト(by -decodeObjectForKey:)を作成し、「自己」ポインタが新しいオブジェクトを参照するようにすることです。これには2つの問題があります。

  • 古いオブジェクトへの参照がなくなったため、リークされました
  • 新しいオブジェクトは保持されないため、消えます(または、解放しようとするとクラッシュします)

オブジェクト自体を置き換えるというアプローチは少し疑わしいと思います。filePathおそらく、変数をDateTrackerオブジェクトの外に移動し、次のような方法でアーカイブを解除する方がよいでしょう。

DateTracker *currentTracker = [[DateTracker unarchiveFromFile:filePath] retain];

ここで、は、 :をいじることなく、unarchiveFromFile:本質的に何をしたかを実行するクラスメソッドです。initFromFileself

+ (DateTracker*)unarchiveFromFile:(NSString *)filePath { 
    DateTracker *result = nil;
    if ([[NSFileManager defaultManager] attributesOfFileSystemForPath:filePath error:NULL]) {
        NSData *data = [[NSMutableData alloc] initWithContentsOfFile:filePath];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        result = [unarchiver decodeObjectForKey:kDateDataKey];
        [unarchiver finishDecoding];
        [unarchiver release];
        [data release];
    }
    return result;
}
于 2010-10-05T12:37:05.873 に答える