web-dev-qa-db-ja.com

removeObserver()はすべてのオブザーバーを削除しますか?

以下は、ビューによって名前が追加されたすべてのNSNotificationCenter.defaultCenterを削除しますか?

NSNotificationCenter.defaultCenter().removeObserver(self)

ViewDidLoad()の同じビューに以下がある場合、それらは上記の1行で削除されますか?

NSNotificationCenter.defaultCenter().addObserver(self, selector: "method1", name: UITextFieldTextDidChangeNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: "method2", name: UITextViewTextDidChangeNotification, object: nil)
18
4thSpace

はい。removeObserver(self)呼び出しは、指定した通知名、オブジェクト、またはセレクターに関係なく、_addObserver:selector:name:object:_を使用して追加したオブザーバーを、オブザーバーselfとともに削除します。

一部のシステムクラス(またはユーザーが定義するオブジェクトのサブクラス)が、知らないオブザーバーを追加している可能性があるため、removeObserver(self)メソッドをオブジェクトのdeinitメソッド以外の場所で使用することはお勧めできません。そのメソッド呼び出しは「焦土」呼び出しであり、オブジェクトからすべてのオブザーバーを削除します。

代わりに、_removeObserver:name:object:_を呼び出して、追加したオブザーバーのみを削除する必要があります。

39
Duncan C

受信者のディスパッチテーブルから、特定のオブザーバーを指定するすべてのエントリを削除します。 https://developer.Apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/index.html#//Apple_ref/occ/instm/NSNotificationCenter/removeObserver

したがって、パラメーターで指定されたものとすべて同じである場合にのみ、すべてのオブザーバーが削除されると思います。

1
tedzhu