0

私が観察しているオブジェクトの配列で満たされたテーブルがあり、すべてのオブジェクトを削除すると、observer が削除されますが、問題は、配列内のすべてのオブジェクトを削除してから、再度追加を開始することです。配列に removeObserver の問題が発生します。

私は自分のオブジェクトへの強い参照を持っています

この方法でオブザーバーを追加しています

[self.object addObserver:self forKeyPath:kTaskCompletedKey options:NSKeyValueObservingOptionNew context:&kTaskObservationContext];

そして、私はこの方法でそれを削除しています

- (void)dealloc;
{
    [self.object removeObserver:self forKeyPath:kTaskCompletedKey context:&kTaskObservationContext];    
}

また、delete メソッドを使用してテーブル内のオブジェクトを削除すると、

NSKVODeallocateBreakを使用してブレークポイントを設定しようとしましたが、行が停止し、それが@sythesize object = m_object;何を意味するのか理解できません.

よろしくランジット

4

1 に答える 1

3

オブジェクトを削除する前に、監視を削除する必要があります。それを行った後、現在のオブザーバーをログに記録できるようにするオブジェクトを送信できるデバッグメッセージがあります-送信してから、オブザーバーがないことを確認します。その後、オブジェクトを安全に解放できます。

編集: 監視しているオブジェクトの場合は、ログを解放済みに追加できます。オブザーバーを報告しない方がよいでしょう。したがって、これを監視対象オブジェクトの dealloc に追加します。

NSLog(@"Dealloc of %@ with observationInfo: %@", self, [self observationInfo]);

コントローラーで、監視対象のオブジェクトを解放する直前に (これは、配列から削除することで行われると想定しています)、次のログを使用します。

id foo = [myArray objectAtIndex:whatever];
NSLog(@"Release %@ with observationInfo: %@", foo, [foo observationInfo]);

まだ観察しているオブジェクトを解放していることがわかった場合、それは問題です。オブジェクトの割り当てが解除され、それがまだ観察されている場合、それも問題です。

編集:オブジェクトを配列に追加する前に、それが既に存在するかどうかをテストします。そうでない場合は、それを観察してください。もしそうなら、あなたはすでにそれを観察していることを知っています。

于 2012-09-26T11:48:50.957 に答える