2011-12-08 12 views
2

ビューコントローラでは、サブビューの配列を作成します。サブビューの配列は、いつでも親ビューから削除できるので、その寿命はビューコントローラの寿命よりも短くなります。KVOオブザーバーを削除するには?

それらを作成するときに、私はかなりこの操作を行います。

  • のAlloc /サブビューのinit
  • はサブビューのframe財産のオブザーバーとしてビューコントローラを追加します。
  • サブビューは、ビューコントローラへの参照を持たない

それを解放図

  • に追加保持アレイ
  • に追加します。

    ユーザがサブビューを削除すると、そのサブビューが削除され、ビューのframeキーパスがオブザーバに削除されていないというエラーがコンソールに表示されます。

    観察されているサブビューがオブザーバーへの参照を保持していない場合、どのようにオブザーバーを削除できますか?

    とにかくremoveAllObserversのようなことはありませんか?

    サブビュー内のオブザーバーへの参照を作成する必要はありません。これは、KVOのポイントをいくらか打ち負かすためです(私はデリゲートのセットアップを使用することもできます)。

  • +1

    保持された配列からUIViewを削除すると、オブザーバを削除できませんでしたか? –

    +0

    サブビュー自体を観察するようにオブザーバーに指示し、ビューが閉じたときに観察を停止することができますか?私はこれが可能なのかどうかはわかりません。そうでない場合は、cwielandの答えを見てください。 – Daniel

    +0

    しかし、サブビューの前にView Controllerが割り当て解除されたらどうなりますか?サブビューの割り当てを解除し、配列を解放してサブビューを削除することで、すでに削除されているオブザーバーを削除しても安全ですか? –

    答えて

    0

    なぜフレームを観測しているのかわかりませんが、削除された時点を知りたいのであれば、代わりにNSNotificationCenterを使うことができます。そこからあなたのサブビューは変更/削除されたことを通知センターに通知できます。あなたの親ビューはその通知を表示し、通知内の内容に応じて何かを行うことができます。それはやや緩やかに縛られたkvoです。

    ここには、セットアップの素晴らしい例があります。 Send and receive messages through NSNotificationCenter in Objective-C?

    このようにして、スーパービューはリリース/アンロード時に通知センターでその用語を監視する必要がありません。

    いずれにしても、それはKVOと代議員以外にもアプローチする別の方法です。

    +0

    他のビューのフレームを更新できるように、フレームが変更されたときは監視したくありません。私はすでにビューが削除されたときに通知センターを使用しています。 –

    関連する問題