32

私のクラスでキー値の観測を使用しようとしています。私はオブザーバを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]; 
} 

ことの一つは、私が追加とobserveeからオブザーバーを削除していますということです、これは私の問題を引き起こす可能性が?

答えて

46

ああ。あなたはSomethingElseオブジェクトのTekkPointオブジェクトを観察していますが、SomethingElseオブジェクトはオブザーバを追加したり削除したりしていますか? (これは正常なやり方です;明確にしようとしています)

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

オブザーバーが消える前に消える可能性のあるオブジェクトを観察する予定がある場合は、オブザーバーを削除する必要があることをオブザーバーに通知する方法が必要です。あなたのTekkPointは、SomethingElseによっても観察されるaliveプロパティを持つことができ、NOに設定されると、TekkPointを観察しているすべての人がオブザーバとして機能しなくなります。

+1

男この回答はちょうど私の人生を保存した、あなたは王 –

+0

シンプルで簡単です。 +1 – govi

+0

もう1つのオプションは、オブジェクトを観察しているオブジェクトで観察されているオブジェクトへの強い参照を作成することです。このようにして、オブザーバも解放されるまで、観察されたオブジェクトは解放されません。 – Avario

2

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

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

あなたのdeallocメソッドの署名をダブルチェック(Objective Cのは非常に厳しいですし、ときあなたが台無しメソッドの名前をあなたに警告することはありません):

+0

のdeallocにリンゴのドキュメントから

[super dealloc] 

呼ぶだろう、私は間違いなく注文権利を持っています。 [super dealloc]は私がdeallocで最後に言うことです。 –

+0

古いスレッドがちょうどそれに出くわしました。うん、スーパーdeallocは間違いなく最後にする必要があります。 – Ben

-10

通常のコードは次のようになります。たとえば、メソッド名が "dealoc"(1つのl)の場合、deallocは決して呼び出されません。

それ以外の場合は、dealloc reoutineを含めるように質問を編集してください。

+12

キー値の観測には関係ありません。 – rpetrich

+0

この質問はKVOではありません通知 –

0

は、なぜあなたはいや

In an implementation of dealloc, do not invoke the superclass’s implementation 
+1

ARCを使用する場合にのみ呼び出す必要はありません。次の質問をご覧ください:http://stackoverflow.com/questions/9058428/documentation-about-dealloc –

関連する問題