removeObserver unter ARC

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • removeObserver unter ARC

    Wie ist der korrekte Weg einen Observer zu entfernen in Projekt mit ARC eingeschaltet.

    Im Moment habe einfach

    Quellcode

    1. - (void)dealloc
    2. {
    3. [[NSNotificationCenter defaultCenter] removeObserver:self];
    4. }

    gemacht.
    Gibt aber eine Warning.
  • Ich packe so etwas immer in eine eigene teardown-Methode (mit entspr. setup-Methode). Diese rufe ich an geeigneter Stelle auf. Oftmals ist dealloc dafür garnicht der richtige Platz. Wenn es sich um ein View handelt so in der Art:

    Quellcode

    1. - (void)viewWillMoveToWindow:(NSWindow *)newWindow
    2. {
    3. BOOL inWindow = ( [ self window ] != nil );
    4. BOOL willBeInWindow = ( newWindow != nil );
    5. if ( willBeInWindow && !inWindow ) {
    6. [ self setupNotifications ];
    7. }
    8. else if ( inWindow && !willBeInWindow ) {
    9. [ self teardownNotifications ];
    10. }
    11. [ super viewWillMoveToWindow:newWindow ];
    12. }
    Alles anzeigen

    Unter iOS dann z.B.

    Quellcode

    1. - (void)willMoveToWindow:(UIWindow *)newWindow
    bzw. -viewWillAppear/-disappear von UIViewController.

    Was für eine Warnung gibt es denn genau?
  • Meldung siehe oben.

    Der Observer ist solange active, wie die App aktiv ist.

    Ich nutze einen Observer um Animationen bzw. die Suche nach einer neuen Lokation zu stoppen bzw. zu starten (applicationDidEnterBackground/applicationDidBecomeActive) bzw. um das iAd Banner zu entfernen nach dem Kauf.

    Im Moment sehe ich nicht wo ich den TearDown unterbringen sollte wenn nicht in dealloc.
  • Thallius schrieb:

    HHuckebein schrieb:

    Klar.

    Method possibly missing a [super dealloc] call


    Naja da hat er wohl recht :)

    Nein, hat er nicht.

    Thallius schrieb:

    Lies noch einmal genau und schau noch einmal hin und dann hau dir vor den Kopf :D

    Jep. Aber nicht so, wie Claus es meint.

    Die Meldung besagt, dass ARC entgegen deiner Ursprungsbehauptung eben nicht aktiviert ist.
    Denn ARC untersagt explizit das Aufrufen der speichermanagementrelevanten Methoden (wie retain, release, autorelease, dealloc).
    Da es dir hier vorgeschlagen wird, kann ARC nicht an sein.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Thallius schrieb:

    HHuckebein schrieb:

    Klar.

    Method possibly missing a [super dealloc] call


    Naja da hat er wohl recht :)

    Nein, hat er nicht.

    Thallius schrieb:

    Lies noch einmal genau und schau noch einmal hin und dann hau dir vor den Kopf :D

    Jep. Aber nicht so, wie Claus es meint.

    Die Meldung besagt, dass ARC entgegen deiner Ursprungsbehauptung eben nicht aktiviert ist.
    Denn ARC untersagt explizit das Aufrufen der speichermanagementrelevanten Methoden (wie retain, release, autorelease, dealloc).
    Da es dir hier vorgeschlagen wird, kann ARC nicht an sein.


    ARC war bei einer Build Configuration off. Keine Ahnung warum.
    Jetzt ist alles ok.

    Danke.
  • Thallius schrieb:

    Lucas de Vil schrieb:

    Nein, hat er nicht.


    Wie jetzt ? Selbst bei ARC würde das Verwenden von dealloc ohne ein [super dealloc] ja wohl nicht funktionieren oder schreibt der Compiler das dann auch für einen da rein ?

    Gruß

    Claus


    [super dealloc] unter ARC ist ja nicht erlaubt und ja ich denke da gibt es einen wie auch immer gearteten Automatismus.
  • Thallius schrieb:

    Lucas de Vil schrieb:

    Nein, hat er nicht.


    Wie jetzt ? Selbst bei ARC würde das Verwenden von dealloc ohne ein [super dealloc] ja wohl nicht funktionieren oder schreibt der Compiler das dann auch für einen da rein ?

    Gruß

    Claus

    Das Laufzeitsystem macht das automatisch. (Ich finde es übrigens ugly, aber mich fragt ja keiner.)

    Bedenke, dass in einer Instanz sich alle IVars in einer Liste, nicht einer hierarchischen Struktur befinden (auch wenn sie aus mehreren Klassenebenen stammen) und daher mit einer Schleife abgehandelt werden können.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Thallius schrieb:

    Lucas de Vil schrieb:

    Nein, hat er nicht.

    Wie jetzt ? Selbst bei ARC würde das Verwenden von dealloc ohne ein [super dealloc] ja wohl nicht funktionieren oder schreibt der Compiler das dann auch für einen da rein ?

    Eyup. Das meinte Amin andererorts mutmaßlich mit 'dealloc verkommt zu einem finalizer'.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Thallius schrieb:

    Lucas de Vil schrieb:

    Nein, hat er nicht.

    Wie jetzt ? Selbst bei ARC würde das Verwenden von dealloc ohne ein [super dealloc] ja wohl nicht funktionieren oder schreibt der Compiler das dann auch für einen da rein ?

    Eyup. Das meinte Amin andererorts mutmaßlich mit 'dealloc verkommt zu einem finalizer'.

    Womit dann auch klar wäre, dass Markus' Idee nicht komplett verkehrt ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?