objective-c cocoa automatic-ref-counting nsnotificationcenter

objective c - En ARC necesitamos enviar removeObserver: explícitamente?



objective-c cocoa (4)

A partir del 10.11 los observadores no están obligados a cancelar el registro en su método de desasignación.

NSNotificationCenter y NSDistributedNotificationCenter ya no envían notificaciones a los observadores registrados que pueden ser desasignados. Si el observador puede almacenarse como una referencia débil a cero, el almacenamiento subyacente almacena el observador como una referencia débil a cero. Alternativamente, si el objeto no puede almacenarse débilmente (debido a que tiene un mecanismo personalizado de retención / liberación que evitaría que el tiempo de ejecución pueda almacenar el objeto débilmente), el objeto se almacena como una referencia de reducción a cero no débil. Esto significa que los observadores no están obligados a cancelar el registro en su método de desasignación. [1]

¿Tenemos que enviar removeObserver: explícitamente para los objetos que se han agregado como observadores a un NSNotificationCenter antes?

Estoy un poco confundido e incapaz de encontrar la respuesta exacta para esto.

Por favor, indíqueme en detalle sobre esto, incluyendo por qué necesitamos eliminar explícitamente el Servidor, y ¿por qué el compilador no lo pone de manera implícita en la clase / aplicación?


Eliminar al observador siempre es una buena idea. Si no elimina el observador, se seguirán enviando mensajes, incluso si el objeto se desasignó. Incluso se podría adjuntar a otro objeto, lo que definitivamente llevaría a serios problemas.


Sí, debe llamar a removeObserver: si no lo hace, la clase observada podría llamar a todas las instancias desasignadas del observador.


Siempre es necesario eliminar observadores para KVO así como para Notificaciones.