32

Sto tentando di utilizzare l'osservazione dei valori-chiave in una delle mie classi. Ho registrato gli osservatori nel metodo init e li ho rimossi/cancellati nel dealloc, ma ottengo il seguente errore che sembra verificarsi prima che il mio metodo dealloc venga chiamato, secondo le mie stampe di debug.Quando dovrei rimuovere gli osservatori? Errore nel deallocare gli oggetti prima di rimuovere gli osservatori

Un'istanza 0x583870 della classe TekkPoint viene deallocata mentre gli osservatori di valori chiave sono ancora registrati con esso. Le informazioni di osservazione sono trapelate e potrebbero anche essere erroneamente associate ad altri oggetti. Impostare un punto di interruzione su NSKVODeallocateBreak per fermarsi qui nel debugger. Ecco l'attuale informazioni di osservazione: ( Contesto: 0x0, di proprietà: 0x536400> Contesto: 0x0, di proprietà: 0x55aba0> )

C'è un modo particolare che dovrei rimuovere gli osservatori? O forse un posto particolare che dovrei rimuovere?

In base a questo question Sto facendo le cose per bene, ma perché dovrei ricevere questo messaggio di errore?

Ecco la mia routine dealloc:

- (void)dealloc { 
    // Remove all observers. 
    for (NSString *path in [TekkPoint observedPaths]) { 
    [self removeObserver:[option_ tChart] 
      forKeyPath:path]; 

    } 

    [description_ release]; 
    [weight_ release]; 
    [super dealloc]; 
} 

Una cosa da notare che potrebbe essere strano mia implementazione è che sto aggiungendo e rimuovendo gli osservatori dal observee, questo potrebbe causare il mio problema?

risposta

46

Ah. Stai osservando un oggetto SomethingElse da un oggetto SomethingElse e l'oggetto SomethingElse è quello che aggiunge e rimuove gli osservatori, corretto? (Questo è il modo normale le cose vengono fatte, sto solo cercando di chiarire.)

sembra che l'oggetto TekkPoint viene deallocato mentre il SomethingElse che sta osservando è ancora in giro. Il metodo dealloc SomethingElse non viene chiamato perché è lo TekkPoint che è stato deallocato, non lo SomethingElse.

Se stai pensando di osservare un oggetto che potrebbe scomparire prima che scompaia l'osservatore, allora hai bisogno di un modo per notificare agli osservatori che dovrebbero rimuovere i loro osservatori. Il tuo TekkPoint potrebbe avere una proprietà alive che sarebbe anche osservata dallo SomethingElse e quando viene impostato su NO, tutti gli utenti che osservano lo TekkPoint si rimuoveranno come osservatori.

+1

uomo questa risposta mi ha appena salvato la vita, tu il re –

+0

semplice e facile. +1 – govi

+0

Un'altra opzione è creare un riferimento forte all'oggetto osservato nell'oggetto che lo osserva. In questo modo l'oggetto osservato non sarà rilasciato fino a quando anche l'osservatore non verrà rilasciato. – Avario

2

Stai chiamando [super dealloc]prima del rimuovi i tuoi osservatori? Chiamare il super dealloc troppo presto potrebbe portare a un errore come questo.

+0

No, ho sicuramente il giusto ordine. [super dealloc] è l'ultima cosa che chiamo nel mio dealloc. –

+0

Vecchio thread ma appena trovato. Sì, super dealloc sicuramente dovrebbe essere l'ultimo. – Ben

-10

Il codice normale simile a questa:

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

Doppia controllare la vostra firma del metodo dealloc (Objective C è molto spietato e non sarà mai di avvertimento quando si rovinare il nome di un metodo). Ad esempio, se il tuo nome metodo era "dealoc" (con una l), il tuo dealloc non verrebbe mai chiamato.

Altrimenti, modifica la domanda per includere il tuo dealloc reoutine.

+12

Non correlato all'osservazione del valore chiave. – rpetrich

+0

Questa domanda è per KVO Not Notifiche –

0

perché si chiamare

[super dealloc] 

Da documentazione mela sulla dealloc

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

Non è necessario chiamarlo solo quando si utilizza ARC, vedere questa domanda: http://stackoverflow.com/questions/9058428/documentation-about-dealloc –

Problemi correlati