16

Müssen wir removeObserver: explizit für Objekte senden, die zuvor als Beobachter einer NSNotificationCenter hinzugefügt wurden?In ARC müssen wir removeObserver senden: explizit?

Ich bin etwas verwirrt und nicht in der Lage, die genaue Antwort dafür zu finden.

Bitte geben Sie mir im Detail, dazu einschließlich warum wir removeObserver explizit, und warum Compiler nicht implizit in Klasse/Anwendung setzen?

Antwort

13

Ja, Sie müssen removeObserver: aufrufen, wenn Sie nicht die beobachtete Klasse alle freigegebene Instanz des Beobachters aufrufen könnte.

+2

Dann warum ARC Vorkehrungen dafür trifft? Wie es setzt [...]; warum es nicht [... removeObserver: ...] setzt?/ –

+7

Natürlich weiß NSNotificationCenter, wer beobachtet: Es muss schließlich die Benachrichtigungen weiterleiten. Es scheint, als hätten sie schwache Referenzen auf Null setzen können, um sicherzustellen, dass Benachrichtigungen nicht an freigelassene Beobachter gesendet werden. Aber ich habe eine kurze Demo gemacht, nur um es zu überprüfen, und es stürzt ab, wenn Sie removeObserver nicht aufrufen: in dealloc. Dang. – davehayden

+0

Es muss nicht notwendig sein, da es einen schwachen Verweis auf den Beobachter geben kann, aber wenn Apple nicht explizit dokumentiert, dass es nicht notwendig ist, ist es notwendig. Vielleicht müssen wir eine Feature-Anfrage machen. –

5

Das Entfernen des Beobachters ist immer eine gute Idee. Wenn Sie den Beobachter nicht entfernen, werden weiterhin Nachrichten gesendet, selbst wenn das Objekt nicht zugeordnet wurde. Es könnte sogar an einem anderen Objekt angebracht sein, was definitiv zu ernsthaften Problemen führen würde.

+0

Es ist nicht erforderlich, wenn Sie iOS 9 oder höher als Ziel haben. –

2

Sie müssen immer Beobachter für KVO sowie für Benachrichtigungen entfernen.

7

Ab 10.11 müssen Beobachter ihre Entbündelungsmethode nicht abmelden.

NSNotificationCenter und NSDistributedNotificationCenter nicht mehr Benachrichtigungen an registrierte Beobachter senden, die freigegeben werden können. Wenn der Beobachter in der Lage ist, als Null-schwache Referenz gespeichert zu werden, speichert der zugrunde liegende Speicher den Beobachter als eine auf Null gestellte schwache Referenz. Wenn das Objekt nicht schwach gespeichert werden kann (weil es einen benutzerdefinierten Retain/Release-Mechanismushat, der verhindert, dass die Laufzeit das Objekt schwach speichern kann), wird das Objekt als nicht-schwache Nullsetzungsreferenz gespeichert. Dies bedeutet, dass Beobachter nicht erforderlich sind, um sich in ihrer Freigabe-Methode zu entfernen. [1]

+0

Danke, um das hier hinzuzufügen. Selbst ich war mir dessen nicht bewusst. –

+1

Je mehr Zeit vergeht und ältere SDKs nicht mehr verwendet werden, desto korrekter wird diese Antwort mit den anderen Antworten verglichen. Es ist eine Schande, dass es als letzte Antwort aufgeführt ist. – otto

+1

Dies gilt natürlich auch für iOS9 (aber nicht für iOS8). Ref: http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ –

Verwandte Themen