2009-01-08 7 views
18

Kann jemand die Situation in Bezug auf -[NSNotificationCenter addObserver:selector:name:object:] klären/aufklären?Welchen Referenztyp behält NSNotificationCenter für das Objekt 'Beobachter'?

  • Welche Arten von Referenzen werden vom Benachrichtigungszentrum der Argumente 'observer' und 'object' aufbewahrt?

  • Welche Best Practices zum Entfernen von Beobachtern aus dem Benachrichtigungscenter?

  • Was sind die besonderen Belange für Multithread-Anwendungen, insbesondere in Bezug auf das Argument 'object'?

  • Was sind die Unterschiede im Verhalten dieser Methode in GC- und Nicht-GC-Umgebungen?

  • Sind die signifikanten Unterschiede (aus der Sicht eines Clients) zwischen mobilen und Desktop-Umgebungen im Verhalten dieser Methode?

  • Auch alle Hinweise auf bestehende Artikel, die dies abdecken, würden sehr geschätzt werden. Ich googelte, aber war überrascht, kleine eingehende Diskussion dieser Probleme zu finden (obwohl ich vielleicht nicht die richtigen magischen Schlüsselwörter verwendete).

    +0

    thx für die Bearbeitung chris. –

    Antwort

    24

    welche Arten von Referenzen von die Benachrichtigung Zentrum der ‚Beobachter‘ und ‚Objekt‘ Argumente gehalten werden?

    Ich glaube eine schwache Referenz, obwohl das nur aus dem Speicher (kein Wortspiel beabsichtigt) ist.

    was sind die besten Praktiken für Entfernen Beobachter der Notification Center?

    Entfernen Sie das registrierte Objekt immer aus dem Benachrichtigungscenter, bevor es freigegeben wird. Die Dealloc-Methode des Objekts ist dafür geeignet, wenn sie die Registrierung selbst erstellt oder wenn Sie sie freigeben, wenn ein anderes Objekt die Benachrichtigungsabonnements verwaltet. Behalte dies im Hinterkopf und das oben Genannte spielt keine Rolle.

    was sind die besonderen Anliegen für Multi-Threaded-Anwendungen, besonders WRT das 'Objekt' Argument?

    NSNotificationCenter auf Themen funktioniert gut, aber , wenn Sie eine Benachrichtigung von einem Hintergrund-Thread senden, wird das Objekt auf demselben Thread erhalten. Aufgrund dieses Verhaltens sollten Sie einen anderen Ansatz verwenden, wenn Sie die Benutzeroberfläche aktualisieren oder etwas tun, das nicht threadsicher ist (oder die Benachrichtigung von einer anderen Methode im Hauptthread senden).

    was sind die Unterschiede im Verhalten diese Methode in der GC und nicht-GC Umgebungen?

    Ich kann mich nicht daran erinnern, etwas gehört zu haben, worüber man sich Sorgen machen muss, obwohl ich den GC noch nicht sehr oft benutzt habe.

    sind der signifikanten Unterschiede (aus Kundensicht) zwischen mobilen und Desktop-Umgebungen in dieses Verhalten Methode?

    Nicht dass ich davon gehört habe, nein. Wenn Sie Ihr Objekt registrieren, können Sie sich für alle Benachrichtigungen oder nur Benachrichtigungen von einem bestimmten Objekt registrieren. Wenn Sie Benachrichtigungen stark verwenden, können diese ein wenig schneller sein, aber testen Sie immer, um sicher zu gehen.

    Auch alle Hinweise Artikel zu bestehenden, die diese decken wäre sehr geschätzt. Ich googelte, aber war überrascht, wenig eingehende Diskussion dieser Ausgaben zu finden (obwohl vielleicht ich nicht die richtigen magischen Schlüsselwörter benutzte).

    Ich denke, es ist mehr, weil NSNotificationCenter im Allgemeinen ziemlich einfach zu bedienen ist. Wenn Sie sich über bestimmte Fälle Sorgen machen, haben Sie keine Angst, eine schnelle Test-App zu schreiben!

    +1

    Insbesondere wenn Sie NSNotificationCenter unter GC verwenden, müssen Sie removeObserver: messages nicht ausgeben, und wenn Ihr Objekt fertiggestellt ist, werden alle Referenzen, die das Zentrum hat, auf Null gesetzt. –

    +0

    In der Dokumentation verwendet 'NSNotificationCenter' eine unsichere, nicht gespeicherte Referenz auf alle beteiligten Objekte (im Gegensatz zur Nullsetzung der schwachen Referenz). Dies wird durch die Anforderung impliziert, dass 'removeObserver' aufgerufen werden muss, bevor irgendein Objekt freigegeben wird. – adib

    8

    aktuelle Situation im Jahr 2016:

    iOS 9 has changedNSNotificationCenter, so dass es schwacher Verweis das Zielobjekt.

    Das auch zu sagen, Sie müssen nicht mehr removeObserver in, wenn das Objekt dealloc ist.