Wie entferne ich einen Beobachter aus einem Objekt unter ARC ? Fügen wir einfach den Beobachter hinzu und vergessen, ihn zu entfernen? Wenn wir den Speicher nicht mehr manuell verwalten, wo treten wir dann von der Beobachtung zurück?
Zum Beispiel auf einem View Controller:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Zuvor habe ich removeObserver:
die dealloc
Methode des View Controllers aufgerufen .
ios
cocoa-touch
key-value-observing
automatic-ref-counting
betrunkener Bass
quelle
quelle
@"frame"
eher sein als@"self.frame"
?Antworten:
Sie können weiterhin
-dealloc
unter ARC implementieren. Dies scheint der geeignete Ort zu sein, um die Beobachtung von Schlüsselwerten zu entfernen. Sie rufen mit[super dealloc]
dieser Methode einfach nicht mehr auf.Wenn Sie
-release
vorher überschrieben haben, haben Sie die Dinge falsch gemacht.quelle
[super dealloc]
. Wer sollte das noch für Sie tun?[super dealloc]
eine Dealloc-Methode aufzurufen. Keine Ahnung, wie das dann funktionieren würde, wenn die erwähnte Klasse untergeordnet wird. Vielleicht ist es nur ratsam,finalize
stattdessen zu verwenden (wo Sie anrufen[super finalize]
)[super dealloc]
last in dieser Methode bei der manuellen Speicherverwaltung so gut wie immer ein Fehler ist, behandelt der Compiler dies jetzt für Sie, weshalb Sie nicht-dealloc
mehr direkt aufrufen können. Die einzigen Dinge, die Sie in eine-dealloc
Methode unter ARC einfügen, sind nicht objektbezogene Ressourcen, die Sie freigeben müssen, oder Bereinigungsaufgaben wie das Entfernen von Beobachtern. Der Wortlaut, den sie verwenden, ist etwas matschig, aber das haben sie gemeint.-finalize
wird dies unter Garbage Collection verwendet, wo-dealloc
es nie aufgerufen wird, aber es ist durchaus akzeptabel, diesen Code-dealloc
unter ARC zu platzieren.[super dealloc]
wird automatisch für Sie aufgerufen, weshalb es ein Fehler ist, es unter ARC aufzurufen.Ich mache es mit diesem Code
quelle
dealloc
? Es ist zu spät, etwas dagegen zu unternehmen.An anderer Stelle beim Stapelüberlauf empfiehlt Chris Hanson, zu diesem Zweck die Finalize-Methode zu verwenden und eine separate Invalidierungsmethode zu implementieren, damit Eigentümer den Objekten mitteilen können, dass sie fertig sind. In der Vergangenheit habe ich festgestellt, dass Hansons Lösungen gut durchdacht sind, also werde ich damit weitermachen.
quelle
-dealloc
wird nie aufgerufen. In ARC ist es. Es ist durchaus akzeptabel, KVO-Beobachter zu entfernen-dealloc
, wie Chris Lattner (der weiß, wovon er spricht) in Apples Entwicklerforen hier angibt