32

クラスの 1 つでキー値監視を使用しようとしています。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 つは、オブザーバーをオブザーバーに追加したり、オブザービーから削除したりしていることです。これにより、問題が発生する可能性がありますか?

4

4 に答える 4

46

ああ。TekkPointオブジェクトからオブジェクトを観察していますがSomethingElseSomethingElseオブジェクトはオブザーバーを追加および削除するオブジェクトですよね? (これが通常のやり方です。明確にしようとしているだけです。)

オブジェクトがまだ周囲にあることを観察しているTekkPoint間に、オブジェクトの割り当てが解除されているようです。dealloc メソッドは呼び出されませんSomethingElse。これは、割り当てが解除されるのは ではなく であるためです。SomethingElseTekkPointSomethingElse

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

于 2009-06-13T18:22:48.780 に答える
2

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

于 2009-06-13T07:08:53.130 に答える
0

なぜあなたは電話するのですか

[super dealloc]

dealloc に関する Apple のドキュメントから

In an implementation of dealloc, do not invoke the superclass’s implementation
于 2014-05-14T15:30:45.953 に答える
-11

通常のコードは次のようになります。

- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

dealloc メソッドの署名を再確認してください (Objective C は非常に厳格で、メソッドの名前を間違えても警告は表示されません)。たとえば、メソッド名が「dealoc」(l が 1 つ) の場合、dealloc は呼び出されません。

それ以外の場合は、質問を編集して、dealloc reoutine を含めます。

于 2009-06-13T09:04:48.683 に答える