0

私のRowクラスには、initWithCoderメソッドがあり、そのメソッドで復元されたものはすべて正常に機能しますが、メソッド内でのみ機能します。メソッドが呼び出された後、Rowクラスにあるサウンドの配列を失います。サウンドクラスにもinitWithCoderメソッドがあり、サウンドは正常に再生されますが、RowクラスのinitWithCoderメソッドでのみ再生されます。Rowオブジェクトをデコードすると、サウンド配列が完全に消え、呼び出すことができなくなります。

initWithCoderのソースは次のとおりです。

- (id) initWithCoder:(NSCoder *)coder {
    ...
    soundArray = [coder decodeObjectForKey:@"soundArray"];
    NSLog(@"%d",[soundArray count]);
    return self;
}

ログには、カウントが8と表示されます(これはアーカイブ解除中です)。次に、作成した行オブジェクトが割り当てられます。そして、結果の行オブジェクトには、soundArrayがなくなります。

[NSKeyedArchiver archiveRootObject:row toFile:@"DefaultRow"];
...
row = [NSKeyedUnarchiver unarchiveObjectWithFile:@"DefaultRow"];

そのため、soundArrayを呼び出すとクラッシュします。

//ERROR IS HERE
NSLog(@"%d",[[row soundArray] count]);

助けてください(soundArrayはNSMutableArrayです)。

4

1 に答える 1

2

あなたはsoundArrayを保持する必要があります—あなたはAppleのサイトinitWithCoder:でCocoaメモリ管理について読むことができます。

soundArrayを使用しない場合は、所有権を主張していないため、retain後でdealloc'edされます。基本的に、decodeObjectForKey:されているオブジェクトを返しますautoreleased

于 2010-06-15T02:04:29.097 に答える