Ich versuche Schlüsselwert-Beobachtung in einer meiner Klassen zu verwenden. Ich registriere die Beobachter in der Methode init und entferne sie/deRegister sie in der Dealloc, aber ich erhalte den folgenden Fehler, der anscheinend auftritt, bevor meine dealloc Methode entsprechend meinen debug Ausdrucken aufgerufen wird.Wann sollte ich Beobachter entfernen? Fehler beim Freigeben von Objekten vor dem Entfernen von Beobachtern
Eine Instanz 0x583870 der Klasse TekkPoint wird freigegeben, während Schlüsselwertbeobachter noch bei ihm registriert sind. Beobachtungsinformationen werden durchgesickert und können sogar fälschlicherweise an andere Objekte angehängt werden. Legen Sie einen Haltepunkt für NSKVODeallocateBreak fest, um hier im Debugger zu stoppen. Hier ist die aktuelle Beobachtung Info: ( Kontext: 0x0, Eigentum: 0x536400> Kontext: 0x0, Eigentum: 0x55aba0> )
Gibt es eine bestimmte Art und Weise ich Beobachter entfernen sollte? Oder vielleicht ein bestimmter Ort, an dem ich sie entfernen sollte?
Nach dieser question mache ich Dinge richtig, aber warum sollte ich diese Fehlermeldung erhalten?
Hier meine dealloc Routine ist:
- (void)dealloc {
// Remove all observers.
for (NSString *path in [TekkPoint observedPaths]) {
[self removeObserver:[option_ tChart]
forKeyPath:path];
}
[description_ release];
[weight_ release];
[super dealloc];
}
Eine Sache zu beachten, dass vielleicht über meine Implementierung seltsam ist, dass ich das Hinzufügen und Beobachter aus dem Beobachteten zu entfernen, könnte dies mein Problem verursachen?
Mann diese Antwort rettete gerade mein Leben, Sie der König –
einfach und einfach. +1 – govi
Eine andere Möglichkeit besteht darin, eine starke Referenz auf das Objekt zu erzeugen, das in dem beobachtenden Objekt beobachtet wird. Auf diese Weise wird das beobachtete Objekt nicht freigegeben, bis der Beobachter ebenfalls freigegeben wird. – Avario