2010-07-07 3 views
5

È corretto utilizzare prima -removeObserver: e quindi chiamare -addObserver: con lo stesso nome? O è una regola avere -addObserver: prima di -removeObserver:?query addobserver/removeobserver

Ho provato utilizzando il sistema operativo 4.0 e sembra OK (nessun incidente, avvisi ... ecc.).

-(void) setObserver 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:OBSERVER_NAME object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector: @selector(selectorName) 
              name:OBSERVER_NAME 
              object:nil]; 
} 

Il motivo è quello di evitare che due osservatori con lo stesso metodo selectorName chiamato due volte assumendo che -setObserver metodo è stato chiamato nuovamente se all'interno -viewDidLoad e un avviso di memoria è stato rilasciato.

Inoltre, è necessario richiamare -removeObserver: durante -dealloc?

+0

+1 buona domanda. Non so se è stato salvato per rimuovere un Observer che non è stato registrato prima, ma so che è un dovere rimuovere l'osservatore prima di deallocare. Per il tuo caso specifico puoi anche rimuovere l'osservatore in viewDidUnload. Ecco a cosa serve questo metodo: Bilanciamento di tutte le chiamate effettuate in loadView e viewDidLoad. – tonklon

risposta

3

Se ricevi -selectorName invocato due volte, probabilmente c'è qualche altro problema con il tuo codice. E anche se Cocoa sarà gentile nel rimuovere gli osservatori che non hai ancora aggiunto, in realtà non lo farei.

Come utente tonklon dice in un commento, è consigliabile rimuovere l'osservatore in -viewDidUnload. Per quanto riguarda la tua ultima domanda, è anche ragionevole rimuovere l'osservatore in -dealloc, sebbene sia buona norma strutturare il codice in modo tale che cose come la rimozione degli osservatori avvengano in un momento deterministico piuttosto che come un effetto collaterale della gestione della memoria.