32

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?

Antwort

46

Ah. Sie beobachten ein TekkPoint Objekt von einem SomethingElse Objekt, und das SomethingElse Objekt ist das Hinzufügen und Entfernen der Beobachter, richtig? (Das ist die normale Art, wie Dinge erledigt werden; ich versuche nur zu klären.)

Es sieht so aus, als ob Ihr TekkPoint Objekt freigegeben wird, während der SomethingElse, der es beobachtet, immer noch da ist. Die Dealloc-Methode SomethingElse wird nicht aufgerufen, weil es die TekkPoint ist, die freigegeben wird, nicht die SomethingElse.

Wenn Sie ein Objekt beobachten möchten, das verschwinden kann, bevor der Beobachter verschwindet, dann brauchen Sie eine Möglichkeit, den Beobachtern mitzuteilen, dass sie ihre Beobachter entfernen müssen. Ihr TekkPoint könnte eine alive Eigenschaft haben, die auch von der SomethingElse beobachtet würde, und wenn es auf NO gesetzt wird, dann würde jeder, der die TekkPoint beobachtet, sich selbst als Beobachter entfernen.

+1

Mann diese Antwort rettete gerade mein Leben, Sie der König –

+0

einfach und einfach. +1 – govi

+0

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

2

Rufen Sie [super dealloc]vor entfernen Sie Ihre Beobachter? Ein zu frühes Aufrufen von Super dealloc könnte zu einem Fehler wie diesem führen.

+0

Nö, ich auf jeden Fall den Auftrag Recht haben. [Super Dealloc] ist das letzte, was ich in meinem Dealloc anrufe. –

+0

Alter Thread, aber gerade erst darüber gekommen. Ja, Super Dealloc sollte definitiv der letzte sein. – Ben

-10

Der normale Code etwa wie folgt aussieht:

- (void) dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 

Verdoppeln Sie Ihre Unterschrift Ihres dealloc Methode überprüfen (Objective C ist sehr unversöhnlich und werden Sie nie warnen, wenn Sie den Namen einer Methode mess up). Wenn Ihr Methodenname beispielsweise "dealoc" (mit einem l) lautet, wird Ihr Dealloc niemals aufgerufen.

Andernfalls bearbeiten Sie Ihre Frage, um Ihre Dealloc-Routine einzuschließen.

+12

Nicht im Zusammenhang mit der Schlüsselwertbeobachtung. – rpetrich

+0

Diese Frage ist für KVO nicht Benachrichtigungen –

0

warum würden Sie rufen

[super dealloc] 

Von Apfel-Dokumentation auf dealloc

In an implementation of dealloc, do not invoke the superclass’s implementation 
+1

Sie müssen es nicht nur aufrufen, wenn Sie ARC verwenden, siehe diese Frage: http://stackoverflow.com/questions/9058428/documentation-about-dealloc –

Verwandte Themen