2012-03-11 5 views
0

を削除されませんそれはわかりやすいので、私はそれらを削除しようとしていますが、これについては最善の方法を知りません。心に浮かぶ唯一のことは、それらをすべて配列に追加し、次にdeallocですべてをループし、それらをオブザーバとして作成したクラスを削除することです。私は完全にどのパラメータを[[NSNotificationCenter defaultCenter] removeObserverに渡すか分からない。各ヘッダービューには、それぞれ異なるコールバックを発生させる3つの異なるボタンがあります。これは3つの配列を必要とするのでしょうか?呼び出されるアクションの種類ごとに、removeTargetを使用しますか? docsからオブザーバー私はUITableViewHeaderにボタンを追加しているが、オブザーバーを解除する前に除去されなかったコンソールメッセージを得ることが

答えて

0

:彼らは前に:)オブジェクト:またはremoveObserver:名前

重要な通知センターは、あなたが removeObserverを使用してオブザーバーを(登録解除することを確認する必要があり、そのため、 をそのオブザーバーを保持しません。 が割り当て解除されました。 (そうしないと センターが解放されたオブジェクトにメッセージを送信する場合は、ランタイムエラーが発生します。)

をあなたがボタンをサブクラス化している場合は、あなたがすべてのオブザーバにメッセージを投稿できること観察可能なUIButtonがkaputに近づいています。

[[NSNotificationCenter defaultCenter] postNotificationName:@"UIButton_dealloc" object:self]; 

または、ボタンはあなたがすることができます削除されますと、ボタンを割り当てクラス:

// The special event 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"UIButton_event" object:theButton]; 
// The dealloc 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopObserving:) name:@"UIButton_dealloc" object:theButton]; 
.... 
-(void) stopObserving:(NSNotification*)notif { 
    if ([name isEqualToString:@"UIButton_dealloc"]) { 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIButton_event" object:object]; 
    } 
} 

[[NSNotificationCenter defaultCenter] postNotificationName:@"UIButton_dealloc" object:theButton]; 

、観察者のオブジェクトは、両方のケースでは、これを行います

しかし、これはUIButtonの場合はやや複雑な例ですが、他の場合には役立ちます。

+0

これは私が現在使用しているコントロールイベントにどのようにマップするのか分かりません。オブザーバを追加するには、私は現在 'addTarget'を使用しています。したがって、' addTarget'を 'removeTarget'する必要はありませんか?いずれにしても、最良のアプローチを追跡するための配列ですか? – Echilon

+0

私はそれが、http://cocoawithlove.com/2008/06/five-approaches-to-listening-observing.htmlオブザーバーの情報を参照してくださいと思う –

+0

それはまだ実際にどのようにターゲットを削除するには答えていないbuttn UIControlEventの場合'removeObserver'のパラメータとして何が渡されますか? – Echilon

関連する問題