web-dev-qa-db-ja.com

いつオブザーバーを削除する必要がありますか?オブザーバーを削除する前にオブジェクトの割り当てを解除する際のエラー

クラスの1つでKey-Value監視を使用しようとしています。オブザーバーをinitメソッドに登録し、deallocで削除/登録解除しましたが、デバッグ出力によると、deallocメソッドが呼び出される前に次のエラーが発生するようです。

クラスTekkPointのインスタンス0x583870は、キー値オブザーバーがまだ登録されている間に割り当てが解除されています。観測情報が漏洩し、他の物体に誤って付着する可能性もあります。 NSKVODeallocateBreakにブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は次のとおりです:(コンテキスト:0x0、プロパティ:0x536400>コンテキスト:0x0、プロパティ:0x55aba0>)

オブザーバーを削除する特別な方法はありますか?それとも、私がそれらを削除する必要がある特定の場所ですか?

これによると 質問 私は物事を正しく行っていますが、なぜこのエラーメッセージが表示されるのですか?

これが私のdeallocルーチンです:

- (void)dealloc {
  // Remove all observers.
  for (NSString *path in [TekkPoint observedPaths]) {
    [self removeObserver:[option_ tChart]
          forKeyPath:path];

  }

  [description_ release];
  [weight_ release];
  [super dealloc];
}

私の実装について奇妙かもしれないことに注意することの1つは、オブザーバーをオブザーバーに追加したり、オブザーバーから削除したりすることです。これにより、問題が発生する可能性がありますか?

32
Kaom Te

ああ。 TekkPointオブジェクトからSomethingElseオブジェクトを監視していて、SomethingElseオブジェクトは、オブザーバーを追加および削除するオブジェクトですよね? (これは通常の方法です。明確にしようとしています。)

TekkPointオブジェクトの割り当てが解除されているようですが、それを監視しているSomethingElseはまだ存在しています。割り当てが解除されるのはSomethingElseであり、TekkPointではないため、SomethingElsedeallocメソッドは呼び出されません。

オブザーバーが消える前に消える可能性のあるオブジェクトを観察することを計画している場合は、オブザーバーを削除する必要があることをオブザーバーに通知する何らかの方法が必要です。 TekkPointaliveプロパティを持つことができます。これはSomethingElseによっても監視され、NOに設定されると、全員がTekkPointはオブザーバーとして自分自身を削除します。

46
BJ Homer

[super dealloc]オブザーバーを削除しますか? superのdeallocの呼び出しが早すぎると、このようなエラーが発生する可能性があります。

2
BJ Homer

なぜあなたは電話しますか

[super dealloc]

From Apple deallocに関するドキュメント

In an implementation of dealloc, do not invoke the superclass’s implementation
0
N3al