16

Dobbiamo inviare removeObserver: esplicitamente per gli oggetti che sono stati aggiunti come osservatori a un NSNotificationCenter prima?In ARC dobbiamo inviare removeObserver: esplicitamente?

Sono un po 'confuso e non riesco a trovare la risposta esatta per questo.

Si prega di fornire in dettaglio, su questo, perché abbiamo bisogno di rimuovereObserver esplicitamente, e perché il compilatore non lo mette implicitamente in classe/applicazione?

risposta

13

Sì, è necessario chiamare removeObserver:, se la classe osservata non può chiamare tutte le istanze deallocate dell'osservatore.

+2

Allora perché ARC non prende precauzioni? Come mette [... release]; perché non mette [... removeObserver: ...]?/ –

+7

Ovviamente NSNotificationCenter sa chi sta osservando: Dopotutto, deve inoltrare le notifiche. Sembra che avrebbero potuto usare zero riferimenti deboli per garantire che le notifiche non vengano inviate agli osservatori liberati. Ma ho fatto una demo veloce solo per ricontrollare e si blocca se non chiami removeObserver: in dealloc. Dang. – davehayden

+0

Non è necessario essere necessario poiché potrebbe esserci un debole riferimento all'osservatore, ma a meno che Apple non documenti esplicitamente che non sia necessario, è necessario. Forse una richiesta di funzionalità che dobbiamo fare. –

5

Rimuovere l'osservatore è sempre una buona idea. Se non si rimuove l'osservatore, i messaggi verranno comunque inviati, anche se l'oggetto è stato deallocato. Potrebbe anche essere collegato a un altro oggetto, il che comporterebbe seri problemi.

+0

Non è necessario se hai scelto come target iOS 9 e versioni successive, il che equivarrebbe praticamente a tutti. –

2

È sempre necessario rimuovere gli osservatori per KVO e per le notifiche.

7

A partire da 10.11 gli osservatori non sono tenuti a annullare la registrazione nel loro metodo di deallocazione.

NSNotificationCenter e NSDistributedNotificationCenter non è più inviare notifiche agli osservatori registrati che possono essere deallocata. Se l'osservatore può essere memorizzato come riferimento di azzeramento-debole, la memoria sottostante di memorizza l'osservatore come riferimento debole di azzeramento. In alternativa, se l'oggetto non può essere memorizzato debolmente (poiché ha un meccanismo di conservazione/rilascio personalizzato che impedisce al runtime di di memorizzare l'oggetto debolmente), l'oggetto viene memorizzato come riferimento di azzeramento non debole . Ciò significa che agli osservatori non è richiesto di annullare la registrazione nel loro metodo di deallocazione. [1]

+0

Grazie Parag, per aver aggiunto questo qui. Anche io ero inconsapevole di questo. –

+1

Più tempo passa e vecchi SDK non funzionano più la risposta è corretta rispetto alle altre risposte. È un peccato che sia elencato come l'ultima risposta. – otto

+1

Questo vale anche per iOS9 apparentemente (ma non per iOS8). Rif: http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ –

Problemi correlati