Mögliche Standorte zum Aufrufen der Methoden addObserver und removeObserver

8

Ich habe einen Fall, in dem die untergeordnete Ansicht eine Benachrichtigung an ihre übergeordnete Ansicht sendet. Jetzt rufe ich addObserver: in viewWillAppear: und removeObserver: in viewWillDisappear: an. Aber ich vermute, das ist nicht korrekt, da viewWillAppear: aufruft, wenn die Ansicht aktualisiert wird.

%Vor%

Danke.

    
Mustafa 01.01.2009, 04:31
quelle

3 Antworten

5

Eigentlich ist das eine schlechte Idee. Wenn der Speicher knapp wird, kann der View-Controller eine Speicherwarnung erhalten. Das Standardverhalten in diesem Fall besteht darin, Ihre Ansicht zu löschen (wenn Sie gerade nicht auf dem Bildschirm sind). In diesem Fall könnten Sie die ViewDidLoad-Nachricht ein zweites Mal erhalten (nach dem Speicherereignis, wenn Ihre Ansicht vom Navigationscontroller wieder auf dem Bildschirm angezeigt wird). Sie haben also zwei Registrierungen desselben Objekts, aber nur eine Entfernung (in seiner Dealloc)

Eine bessere Lösung besteht darin, entweder ein Flag zu setzen, das besagt, dass Sie registriert sind, oder sich in Ihrer init-Methode zu registrieren.

    
Ben Gottlieb 01.01.2009, 13:13
quelle
1

Ich schätze, die korrekten Positionen, die für die Benachrichtigung registriert werden sollen, sind viewDidLoad method, und die korrekte Position, um die Registrierung für gleiche Benachrichtigungen aufzuheben, ist dealloc method.

    
Mustafa 01.01.2009 08:31
quelle
0

Ben hat Recht - aber ich habe einen anderen, möglicherweise fragilen Weg gefunden. Ich habe das gerade entdeckt, weil ich für immer die "... wurde aufgehoben, während Schlüssel Wert Beobachter waren noch mit ihm registriert"

Ich weiß nicht warum - aber als ich in meiner init-Methode addObserver und in meiner dealloc-Methode removeObserver hatte - bekam ich immer noch die Nachricht KVO wurde noch beobachtet. Ich trat durch und vergewisserte mich, dass mein removeObserver korrekt aufgerufen wurde.

Ich habe stattdessen meinen addobserver in die viewDidLoad-Methode verschoben, und das schien zu funktionieren.

Ich habe einen removeObserver in viewDidUnload und in dealloc gelassen; aber ich mag das nicht, weil es nicht ausgeglichen ist. Aber unter normalen Umständen wird mein viewDidUnload nicht aufgerufen - dies ist nur ein Schutz für den Fall, dass ich eine niedrige Speicherbenachrichtigung bekomme.

Aber ich kann sehen, dass potenziell in die Situation gelangt, in der ein Low-Memory-Event eintritt, ViewDidUnload wird aufgerufen. Wenn ich dann irgendwann danach Dealloc drücke (bevor ich wieder auf viewDidLoad drücke), rufe ich removeObserver zweimal auf!

Also, ich denke, ich behalte es einfach in meiner Sicht, und ich werde Dealloc.

Ich weiß immer noch nicht, warum es nicht richtig funktioniert, wenn ich den addobserver in meiner init Methode mache.

    
snarshad 02.03.2012 20:44
quelle