2015-04-21 12 views
11

Wird im Folgenden alles NSNotificationCenter.defaultCenter entfernt, nachdem eine Ansicht hinzugefügt wurde?Entfernt removeObserver() alle Beobachter?

NSNotificationCenter.defaultCenter().removeObserver(self) 

Wenn ich in der gleichen Ansicht von viewDidLoad folgend habe(), werden sie oben mit der einzigen Zeile entfernt werden?

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

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

Antwort

0

Entfernt alle Einträge, die einen bestimmten Beobachter angeben, aus der Versandtabelle des Empfängers. https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/index.html#//apple_ref/occ/instm/NSNotificationCenter/removeObserver:

Also ich denke, es wird alle Beobachter nur entfernen, wenn alle gleich sind wie durch den Parameter angegeben.

+0

Ich habe die Frage aktualisiert. Obwohl die zwei Beobachter im OP zwei verschiedene Methodennamen haben, sollte die einzelne Codezeile beide richtig entfernen? – 4thSpace

+0

Sehen Sie meine Antwort auf Ihre Frage. Die Antwort ist ja, aber benutze es nicht. –

+0

Ihre Antwort ist vage. Welcher "Parameter"? – 4thSpace

31

Ja, der Aufruf removeObserver(self) entfernt alle Beobachter, die Sie unter Verwendung von addObserver:selector:name:object: mit einem Beobachter von self hinzugefügt haben, unabhängig von dem von Ihnen angegebenen Benachrichtigungsnamen, Objekt oder Selektor.

Es ist eine schlechte Idee, die removeObserver(self)-Methode überall in der Deinit-Methode Ihres Objekts zu verwenden, da einige Systemklassen (oder Unterklassen von Objekten, die Sie definieren) Beobachter hinzugefügt haben, von denen Sie nichts wissen. Dieser Methodenaufruf ist ein Aufruf der "verbrannten Erde", der ALLE Beobachter vom Objekt entfernt.

Stattdessen sollten Sie removeObserver:name:object: aufrufen und nur die von Ihnen hinzugefügten Beobachter entfernen.

+0

Wenn ich diese nach Namen entferne, mit welcher Methode sollte ich sie entfernen? Ich habe durch viewDidLoad() geladen. Ich bekomme keine automatische Vervollständigung für ein Deinit. – 4thSpace

+0

Suchen Sie in der Swift-Sprachreferenz iBook (das ist kostenlos). Wenn Sie einen Beobachter in viewDidLoad hinzufügen (der nur einmal bei der Erstellung eines View-Controllers aufgerufen wird), müssen Sie den Balancing-Aufruf an removeObserver in einem 'deinit 'Methode, die Sie hinzufügen. Ihre 'Deinit'-Methode wird direkt vor der Freigabe Ihres Objekts aufgerufen. –

+1

Ich habe meinem UIViewController einen Deinit hinzugefügt. Wie teste ich das im Simulator? Es wird nicht mit einem Home Button Klick oder App Shutdown ausgelöst. – 4thSpace