8

子ビューが親ビューに通知を送信する場合があります。今、私は電話をかけaddObserver:viewWillAppear:removeObserver:ますviewWillDisappear:viewWillAppear:しかし、ビューが更新されたときに呼び出すので、これは正しくないと思います。

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

ありがとう。

4

3 に答える 3

5

実際、これは悪い考えです。メモリが少なくなると、View Controller にメモリ警告が送信される場合があります。この場合のデフォルトの動作は、ビューをクリアすることです (現在画面に表示されていない場合)。この場合、viewDidLoad メッセージを 2 回送信することができます (メモリ イベントの後、ナビゲーション コントローラーによってビューが画面に戻されたとき)。したがって、同じオブジェクトの 2 つの登録がありますが、削除は 1 つだけです。 (dealloc)

より良い解決策は、登録したことを示すフラグを設定するか、init メソッドに登録することです。

于 2009-01-01T13:13:09.183 に答える
1

viewDidLoad通知を登録する正しい位置はメソッドであり、同じ通知を登録解除する正しい位置はメソッドだと思いますdealloc

于 2009-01-01T08:31:39.390 に答える
0

ベンの言うとおりですが、私はそれを回避する方法で、壊れやすい可能性のある別の方法を見つけました。「...キー値オブザーバーがまだ登録されている間に割り当てが解除されました」というメッセージが永遠に表示されていたため、これを発見しました

理由はわかりませんが、init メソッドに addObserver があり、dealloc メソッドに removeObserver がある場合でも、KVO がまだ監視されているというメッセージが表示されていました。ステップを踏んで、removeObserver が正しく呼び出されていることを確認しました。

代わりに addobserver を viewDidLoad メソッドに移動したところ、うまくいったようです。

viewDidUnloadとdealloc に removeObserver を残しました。でもバランス悪いから嫌い。しかし、通常の状況では、viewDidUnload は呼び出されません。これは、メモリ不足の通知を受け取った場合の単なる保護です。

しかし、メモリ不足のイベントが発生し、viewDidUnload が呼び出されるという状況に陥る可能性があることがわかります。その後しばらくして (viewDidLoad をもう一度押す前に) dealloc を押すと、removeObserver が 2 回呼び出されます。

したがって、viewDidLoad と dealloc にそのまま保持すると思います。

init メソッドで addobserver を実行すると、なぜ正しく機能しないのか、まだわかりません。

于 2012-03-02T20:44:37.347 に答える