オブザーバーをいつ削除する必要がありますか?オブザーバーを削除する前のオブジェクトの割り当て解除に関するエラー
-
13-09-2019 - |
質問
私のクラスの 1 つでキーと値の観察を使用しようとしています。init メソッドでオブザーバーを登録し、dealloc でオブザーバーを削除または登録解除しますが、デバッグ出力によると、dealloc メソッドが呼び出される前に発生したと思われる次のエラーが発生します。
TekkPoint クラスのインスタンス 0x583870 は、キー値オブザーバーがまだ登録されている間に割り当てが解除されます。観測情報が漏洩し、誤って他の物体に付着してしまう可能性もある。NSKVODeallocateBreak にブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は以下の通りです。( コンテクスト:0x0、プロパティ:0x536400>コンテキスト:0x0、プロパティ:0x55aba0>)
オブザーバーを削除する特別な方法はありますか?それとも特定の場所を削除すべきでしょうか?
これによれば 質問 正しく行っているのに、なぜこのエラー メッセージが表示されるのでしょうか?
私の解放ルーチンは次のとおりです。
- (void)dealloc {
// Remove all observers.
for (NSString *path in [TekkPoint observedPaths]) {
[self removeObserver:[option_ tChart]
forKeyPath:path];
}
[description_ release];
[weight_ release];
[super dealloc];
}
私の実装で奇妙であるかもしれない注意すべき点の 1 つは、オブザーバーをオブザービーに追加したり削除したりしていることです。これが問題の原因になる可能性がありますか?
解決
ああ。あなたはTekkPoint
オブジェクトからSomethingElse
オブジェクトを観察している、とSomethingElse
オブジェクトが正しい、オブザーバーの追加と削除一つですか? (それは物事が行われている通常の方法だと、私はちょうど明確にしようとしている)。
TekkPoint
がまだ残っている間、あなたのSomethingElse
オブジェクトが割り当て解除されているように、に見えます。それは割り当て解除されていSomethingElse
、ないTekkPoint
だからSomethingElse
のdeallocメソッドが呼び出されません。
あなたは、観察者が消える前に消えることがあり、オブジェクトを観察する上で計画している場合、あなたは彼らのオブザーバーを削除する必要がオブザーバーに通知するいくつかの方法が必要です。あなたのTekkPoint
もalive
によって観察されるであろう、そしてそれはSomethingElse
に設定されますときにNO
を観察し、誰もがオブザーバーとしてその人自身を削除することになるTekkPoint
性質を持つことができます。
他のヒント
あなたはを[super dealloc]
を呼び出していますか?あまりにも早くこのようなエラーにつながる可能性があり、スーパーのdealloc
を呼び出します。
なぜあなたは呼ぶだろう。
[super dealloc]
のdeallocでのリンゴのドキュメントから
In an implementation of dealloc, do not invoke the superclass’s implementation
通常のコードは次のようになります
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
ダブル(Objective Cのは非常に厳しいですし、ときあなたが台無しメソッドの名前をあなたに警告することはありません)あなたのdeallocメソッドの署名を確認してください。あなたのメソッド名は(1リットルで)「dealoc」であった場合たとえば、あなたのdeallocが呼び出されることはありませんでしょう。
それ以外の場合は、お使いのdeallocのreoutineを含めるようにあなたの質問を編集します。