2009-07-02 4 views
0

Iは、次のコンテキストでKVOを使用したいwithEventを:私は/私はその後 ココアタッチの質問。</p> <p>1)touchesBeganにおいて:タッチシーケンスコンテキストでKVOを使用すること

KVO

を介して観察するオブジェクトのインスタンスを初期化ALLOC私の目的は、オブジェクトの生涯にわたる動きを観察することです。

2)touchesEnded:withEvent:このインスタンスをNSMutableArrayに割り当て、インスタンス参照を解放します。これは、NSMutableArrayがNSMutableArrayを保持するようになったためです。また、removeObserver経由でインスタンスのオーバーバーを削除する必要があります。forKeyPath:

悪い匂いの配列要素に再度オブザーバを追加しない限り、これは問題があります。

所有者に関係なく、オブザーバーをオブジェクトに接続したままにする方法はありますか?

おかげで、Objective-Cで ダグ

+0

オブジェクトにオブザーバを割り当てるときにオブジェクトのオブザーバを削除する必要がある理由についてもう少し説明できますか? –

+0

touchesBegan:withEvent:で行われたalloc/initは、親クラスのivarによって行われます。これはtouchesBegan:withEvent:が呼び出されるたびに繰り返されます。 touchesEnded:withEvent:インスタンスを配列に渡します。時間の経過と共に配列が拡大/縮小します。私は、誰が現在それに対して主張しているのかに関わらず、オブザーバーにインスタンスをフォローする必要があります。 – dugla

答えて

1

は、あなたが「自分の」オブジェクト、あなたは単にそれに主張を持っていません。 NSMutableArrayが保持しているだけなので、インスタンスを解放する必要はありません。どちらのインスタンスにも主張することができます。オブジェクトを終了したら、オブザーバーとして自分自身を取り出し、オブジェクトを解放します。 NSMutableArrayを終了したら、それを解放します。このように、すべてがそれ自身を世話します。

+0

いくつかのコンテキスト。 touchesBegan:withEvent:は親オブジェクトのメンバと呼ばれるたびにインスタンスを一時的に割り当て、それをNSMutableArrayに渡します。何度も。オブジェクトが配列に渡されると、インスタンスはそれを必要とするので、解放する必要があります。オブジェクトへのメンバの要求を解放しないとメモリリークが発生します。これは、各alloc/initと対応するリリースのバランスをとることができないためです。 私は、オブザーバをインスタンス化オブジェクトにバインドする自由が必要です。現在、KVOは、インスタンス自体ではなく、インスタンスへの参照についてのみ知っているようです。 – dugla

+0

ああ、不確定な数のオブジェクトを格納する方法として配列を使用しているだけですが、元のビュー(配列の所有者)に、それらのオブジェクトのすべての観察されたプロパティに対するすべての変更が引き続き通知されるようにしたい? この場合、変更可能な配列にオブジェクトを追加するときにオブザーバを削除しないでください。変更可能な配列を解放する直前に、その点でオブザーバを削除するメンバを反復処理するようにしてください。 – hatfinch

+0

ああ、私はあなたが上記のように時間が経つにつれて配列が縮小することに気づいたので、配列からオブジェクトを削除するたびにオブザーバを削除する必要があります。配列のラッパークラスを作成して、オブジェクトの追加と削除時に自動的にオブザーバの追加と削除を処理し、superを呼び出す前にオブジェクトをdeallocですべて削除することもできます。 – hatfinch

関連する問題