Domanda

Ho un caso in cui la vista figlio invia una notifica alla vista padre. Ora sto chiamando addObserver: in viewWillAppear: e removeObserver: in viewWillDisappear: . Ma suppongo che ciò non sia corretto poiché viewWillAppear: chiama quando la vista viene aggiornata.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

Grazie.

È stato utile?

Soluzione

In realtà, questa è una cattiva idea. Quando la memoria si esaurisce, il controller della vista potrebbe ricevere un avviso di memoria. Il comportamento predefinito in questa istanza è cancellare la vista (se non sei attualmente sullo schermo). In questo caso, potresti ricevere il messaggio viewDidLoad inviato una seconda volta (dopo l'evento di memoria, quando la tua vista viene riportata sullo schermo dal suo controller di navigazione.) Quindi avrai due registrazioni dello stesso oggetto, ma solo una rimozione (nel suo dealloc)

Una soluzione migliore è o impostare un flag che dice che sei registrato o registrarti nel tuo metodo init.

Altri suggerimenti

Suppongo che la posizione corretta per registrarsi per la notifica sia il metodo viewDidLoad , mentre la posizione corretta per annullare la registrazione per le stesse notifiche è il metodo dealloc .

Ben ha ragione, ma ho trovato un altro, potenzialmente fragile, un modo per aggirarlo. L'ho appena scoperto perché ottenevo per sempre che " ... era deallocato mentre gli osservatori di valori chiave erano ancora registrati con esso "

Non so perché - ma quando avevo addObserver nel mio metodo init e removeObserver nel mio metodo dealloc - stavo ancora ricevendo il messaggio KVO era ancora osservato. Ho esaminato e verificato che il mio removeObserver veniva chiamato correttamente.

Ho invece spostato il mio addobserver nel metodo viewDidLoad, e questo sembra funzionare.

Ho lasciato un removeObserver in viewDidUnload e in dealloc; ma non mi piace perché non è bilanciato. Ma in circostanze normali, viewDidUnload non viene chiamato - questa è solo protezione nel caso in cui riceva una notifica di memoria insufficiente.

Ma posso vedere potenzialmente entrare nella situazione in cui arriva un evento di memoria insufficiente, viene chiamato viewDidUnload. Se poi premo dealloc qualche tempo dopo (prima di premere di nuovo viewDidLoad), chiamerò due volte removeObserver!

Quindi, penso che lo terrò solo nel mio viewDidLoad e nel mio dealloc.

Non so ancora perché non funzioni correttamente se eseguo l'addobserver nel mio metodo init.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top