クラスの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つは、オブザーバーをオブザーバーに追加したり、オブザーバーから削除したりすることです。これにより、問題が発生する可能性がありますか?
ああ。 TekkPoint
オブジェクトからSomethingElse
オブジェクトを監視していて、SomethingElse
オブジェクトは、オブザーバーを追加および削除するオブジェクトですよね? (これは通常の方法です。明確にしようとしています。)
TekkPoint
オブジェクトの割り当てが解除されているようですが、それを監視しているSomethingElse
はまだ存在しています。割り当てが解除されるのはSomethingElse
であり、TekkPoint
ではないため、SomethingElse
deallocメソッドは呼び出されません。
オブザーバーが消える前に消える可能性のあるオブジェクトを観察することを計画している場合は、オブザーバーを削除する必要があることをオブザーバーに通知する何らかの方法が必要です。 TekkPoint
はalive
プロパティを持つことができます。これはSomethingElse
によっても監視され、NO
に設定されると、全員がTekkPoint
はオブザーバーとして自分自身を削除します。
[super dealloc]
前オブザーバーを削除しますか? superのdealloc
の呼び出しが早すぎると、このようなエラーが発生する可能性があります。
なぜあなたは電話しますか
[super dealloc]
From Apple deallocに関するドキュメント
In an implementation of dealloc, do not invoke the superclass’s implementation