2012-01-31 12 views
6

このトピックに関するさまざまな質問がありますが、私の質問には答えられません。キー値監視オブジェクトの割り当てが解除されたときにremoveObserverを監視します

removeObserverオブジェクトの割り当てが解除されたときにオブジェクトから削除します。複数の項目を監視する必要があるため、KVOを使用しています。その場合、NSNotificationに大きなオーバーヘッドがあります。ここ

シナリオである:

(複数の)オブジェクトは、様々な他のオブジェクトによって観察されています。 observerが割り当て解除されると、オブザーバとして削除できます。しかし、observedの割り当てが解除されると、observersのすべてにオブザーバーとして自分自身を削除するように指示する必要があります。これを行う方法?

答えて

1

通知が届いたら、-(void)deallocから個別に通知を送信できます。他のすべてのオブザーバーを受け入れると、必要な通知が削除されます。

+0

多くの通知はありません.kvoを使用する目的はすべて無効になります。また、それは次のようになります:1.オブジェクトのいくつかのプロパティを観察します。 2.すべての監視対象オブジェクトから、割り当てが解除されたときに通知を発行します。 3.解放通知を聞いてオブザーバを削除します。それはたくさんの仕事です。清潔な解決策はありませんか? – Sailesh

3

オブジェクト(観測)が割り当て解除された場合、そのオブジェクトは変更できません。または、値を変更することはできません。したがって、オブザーバーが割り当て解除されたオブジェクトを観察しており、割り当て解除されたオブジェクトは、通知してからオブザーバーを削除するという楽しみはありますか?
~~~~~~~~~~~~~~~~~~~~~編集~~~~~~~~~~~~~~~~~~~~~~~~
ねえ、私はhereから何かを得ました。考えられるのは、追加のプロパティーがaliveと表示されており、deallocにはalive = NO;と表示されています。このプロパティーが変更されると、すべてのオブザーバーが通知され、オブザーバーをすべて削除できます。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+2

コンソールでこのエラーメッセージが表示された後、削除したいと思います。 'クラス値MyClassのインスタンス0xd89f200は、キー値オブザーバがまだそれに登録されている間に割り当て解除されました。観測情報が漏洩し、他のオブジェクトに間違って付いてしまうことさえあるかもしれません。」 – Sailesh

+0

hmmmそれは深刻なものです...私が何かを見つけることができるかどうか検索してください。返信の感謝: –

+0

私は答えを編集しました... –

2

ここにデザイン問題があると思います。観察されたオブジェクトはオブザーバーを気にする必要はありません。あなたは、観測されたオブジェクトdeallocメソッドからオブザーバを削除したいとします。しかし、なぜそれが割り当て解除されるのですか?それでも観測されていれば、どこかに所有権があるため、オブジェクトは解放されません。 deallocが呼び出された時点で残っていたオブザーバーがいなくても良いデザインが得られます。

モデルオブジェクトにオブザーバとして自身を登録するビューを想像してみてください。このモデルオブジェクトは、ビューまたはコントローラ内に保持されます。モデルオブジェクトは、どこかに保持されている限り、そのオブジェクトをデアロックと呼びません。最後の所有権が解放されたときのみ、deallocを呼び出す必要があります。つまり、view/viewcontrollerを除き、すべての所有権が解放され、1人のオブザーバーが残っているとします(ビュー)。ビュー/ビューコントローラがモデルオブジェクトに対する所有権を解放する前に、ビューをオブザーバとして削除する必要があります。したがって、deallocメソッドが呼び出されるときには、オブザーバが残ってはいけません。

+0

2つのオブジェクトが互いに観察する場合を考えてみましょう。あなたが提案するデザインは、保持サイクルを作ります。いずれにしても、オブザーバは観察されたものに対して弱い参照しか持たないかもしれません。そうしないと、アプリケーションの他のすべての側面を考慮して、良い設計ではない可能性があります。 – Sailesh

+1

私の意見では、お互いを観察している2つのオブジェクトは、悪いデザインのケースです。 –

+0

この回答ありがとうございます。私はモデルに対する弱い所有権を持っているという私の決定は間違っていたことに気付きました。私は今、強い関係に切り換えられました。うまくいけば、私は今多くのKVOのクラッシュを見ることはありません。 – rounak