3

addObserver:selector:name:object:viewDidLoadます。

そして、オブザーバーを削除するためremoveObserver:name:object:に inを使用しています。viewWillDisappear:animated:

に間違ったパラメーターを渡してオブザーバーを削除できなかった場合はどうなりますremoveObserver:name:object:か?
(たとえば、間違った通知をパラメーターに渡しnameたり、間違ったオブジェクトをobjectorに渡したりすると、オブザーバーは削除されませんObserver)

を呼び出した後もオブザーバーがまだ nil でない場合、removeObserver:name:object:notificationSelector が呼び出されるため、オブザーバーの削除に失敗したことがわかります。

しかし、 を呼び出した後にオブザーバーが nil になった場合、オブザーバーのremoveObserver:name:object:削除に失敗したかどうかを確認できません。

オブザーバーが nil になると、オブザーバーは自動的に削除されますか?
それともnotification dispatch table、のNSNotificationCenterがどんどん大きくなり、最終的にアプリが遅くなりますか?

編集

オブザーバーに UIViewController オブジェクトのサブクラスを使用すると、ViewControllerdeallocが呼び出された後にアプリがクラッシュしません。
しかし、他のクラスのオブジェクトを使用すると、オブジェクトが呼び出された後にアプリがクラッシュしますdealloc

4

2 に答える 2

10

更新:から-[NotificationCenter removeObserver:]:

deallocアプリが iOS 9.0 以降または macOS 10.11 以降を対象としている場合、そのメソッドでオブザーバーを登録解除する必要はありません。removeObserver:name:object:それ以外の場合は、オブザーバーまたは で指定されたオブジェクトaddObserverForName:object:queue:usingBlock:または割り当てが解除される前に、このメソッドを呼び出す必要addObserver:selector:name:object:があります。

古い答え:

オブザーバーは自動的に削除されません。NSNotificationCenter クラス リファレンスから:

重要: 通知センターはオブザーバーを保持しないため、オブザーバーの割り当てを解除する前に、(removeObserver: または removeObserver:name:object: を使用して) オブザーバーを登録解除する必要があります。(そうしないと、センターが解放されたオブジェクトにメッセージを送信すると、実行時エラーが発生します。)

したがって、電話する必要があります

[[NSNotificationCenter defaultCenter] removeObserver:self];

deallocオブザーバーが以前に削除されていないことを 100% 確信できない場合は、メソッドで。

于 2012-07-18T15:33:13.300 に答える
0

オブザーバーを削除するには、正しいオブザーバーを配置するだけです。name または object (または nil) に間違ったパラメーターを渡すと、受信側はそれらを削除の基準として使用しません。

すべての Cocoa プログラムにはデフォルトの NSNotificationCenter があるため、一度オブザーバーを削除すると、それがより多くのメモリを消費することを心配する必要はありません。

于 2012-07-18T15:36:04.353 に答える