2012-01-31 12 views
6

Ci sono varie domande relative a questo argomento ma nessuno di questi risponde alla mia domanda.Valore chiave Osservare removeObserver quando l'oggetto osservato è deallocato

Voglio removeObserver da un oggetto quando quell'oggetto viene deallocato. Sto usando KVO poiché più elementi devono essere osservati, e NSNotification ha un sovraccarico enorme in quel caso.

Ecco lo scenario:

(multipli) oggetti sono osservati da vari altri oggetti. Quando lo observer viene deallocato, posso rimuoverlo come osservatore. Ma quando lo observed viene deallocato, devo dire a tutti gli observers di rimuovere se stessi come osservatori. Come fare questo?

risposta

1

è possibile pubblicare separatamente una notifica da -(void)dealloc quando viene rilasciato deallocated. al ricevimento di tutti gli altri osservatori rimuoverà la notifica richiesta.

+0

Non ci saranno così tante notifiche, e l'intero scopo dell'uso di kvo viene sconfitto. Inoltre, finirebbe come: 1. Osservare alcune proprietà di un oggetto. 2. Da tutti gli oggetti osservati, attiva una notifica quando viene deallocato. 3. Ascolta la notifica di deallocazione e rimuovi l'osservatore. Questo è un sacco di lavoro. Non c'è una soluzione pulita? – Sailesh

3

Sailesh se l'oggetto (osservato) viene deallocato, quindi quell'oggetto non può essere modificato o il suo valore non può essere modificato in modo tale che se gli osservatori osservano un oggetto deallocato e quell'oggetto deallocato non invierà mai alcun tipo di osservazione notifica allora C'è qualche divertimento nel rimuovere gli osservatori ???
~~~~~~~~~~~~~~~~~~~~~ Modificato ~~~~~~~~~~~~~~~~~~~~~~~~
hey Ho preso qualche cosa da here. L'idea è che tu osservi una proprietà aggiuntiva dire alive e scrivi in ​​dealloc di alive = NO; e, poiché questa proprietà è cambiata, tutti gli osservatori riceveranno una notifica e quindi potrai rimuovere tutti gli osservatori.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+2

Dopo aver visto questo messaggio di errore nella console, si desidera rimuovereObserver, anche se non è divertente :). 'Un'istanza 0xd89f200 della classe MyClass è stata deallocata mentre gli osservatori dei valori chiave erano ancora registrati con esso. Le informazioni di osservazione sono trapelate e potrebbero anche essere erroneamente associate a qualche altro oggetto. – Sailesh

+0

hmmm è una cosa seria ... fammi cercare se riesco a trovare qualcosa ... grazie per aver risposto :) –

+0

Ho modificato la risposta ... –

2

Penso che ci sia un problema di progettazione qui. L'oggetto osservato non dovrebbe preoccuparsi dei suoi osservatori. Tu dici di voler rimuovere gli osservatori dal metodo dealloc degli oggetti osservati. Ma perché viene deallocato? Se è ancora osservato c'è una proprietà da qualche parte quindi l'oggetto non sarà deallocato. Il buon design non porta a nessun osservatore lasciato al momento in cui viene chiamato dealloc.

Immaginate una vista che si registra come osservatore di un oggetto modello. Questo oggetto modello viene mantenuto nella vista o nel controller. L'oggetto modello non chiamerà dealloc fintanto che viene mantenuto da qualche parte. Solo quando viene rilasciata l'ultima proprietà, è necessario chiamare dealloc. Quindi, tutte le proprietà vengono rilasciate, ad eccezione di view/viewcontroller e c'è un osservatore rimasto (la vista). Ora, prima che la vista/viewcontroller rilasci la sua proprietà sull'oggetto modello, dovrebbe anche rimuovere la vista come osservatore. Quindi, nel momento in cui viene chiamato il metodo dealloc, non ci dovrebbe essere nessun osservatore rimasto.

+0

Considera un caso in cui due oggetti si osservano l'un l'altro. Il design che suggerisci creerebbe un ciclo di conservazione. In ogni caso, l'osservatore potrebbe avere solo un debole riferimento all'osservato, e diversamente potrebbe non essere un buon design, considerando tutti gli altri aspetti dell'app. – Sailesh

+1

Secondo me due oggetti che si osservano l'un l'altro è un caso di cattivo design. –

+0

Grazie per questa risposta. Mi sono reso conto che la mia decisione di avere una debole proprietà sul modello era sbagliata. Sono passato a una relazione forte ora e, si spera, non vedo molti incidenti KVO ora. – rounak

Problemi correlati