2012-02-28 7 views
3

私はクラスを持っており、私はそれをオブザーバーとして使用しています。他のオブジェクトがプロパティを変更したときに通知する必要があります。割り当てが解除されると、私はオブザーバーを削除する気にはなりません。しかし、私はこのようなエラーを受け取ります:観測情報が漏洩しました

An instance 0xf819680 of class **** was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info: 

今、私は本当になぜこれが問題になるかは分かりません。 KVOの私の理解では、オブジェクトAがオブジェクトBを観察したいならば、AはBを保持し、その後

[B addObserver:A]; // shortened just to get the point across 

とBがサイクルを避けるために保持ませをするということです。したがって、Aが割り当て解除された場合、Bのオブザーバとして自分自身を削除する必要があります。それ以外の場合は、Aは以前の場所への参照を持ちません(でないのでを保持します)。

しかし、この警告は、Bを割り当て解除すると何か悪いことが起こることを意味するようです。私が起こっていることが想像できる唯一の事は、Bが持っているAへの弱い参照がなくなり、Aはそれ以上の通知を得られないということです。私は「観測情報が漏洩した」ということを知らない。 Bがなくなると、それが保存していた観測情報が消えてしまうのはなぜですか?

答えて

3

実際、私は自分自身の答えを見つけました。 Bの割り当てを解除すると、観測情報が解放されないようです。これは、KVOがカテゴリ(オブジェクト自体に追加のデータを追加できない)によって実装されるため、KVOフレームワークによってデータのどこかにデータを保持する必要があるためです。

addObserverのドキュメントによると:

Neither the receiver, nor anObserver, are retained. 

したがって、あなたはKVOフレームワークをDEALLOCとき、それは(それが通知を計算するために使用する)Bにあり、ポインタが無効であることを知りません。したがって、別のオブジェクトが同じメモリ空間に存在する場合、それは観測されるオブジェクトになり、不要な通知を送信する可能性があります。

関連する問題