2009-01-08 4 views
18

¿Alguien puede aclarar/aclarar la situación con respecto a -[NSNotificationCenter addObserver:selector:name:object:]?¿Qué tipo de referencia mantiene NSNotificationCenter para los objetos del "observador y"?

  • ¿Qué tipos de referencias mantiene el centro de notificación de los argumentos de "observador" y "objeto"?

  • ¿Cuáles son las mejores prácticas para eliminar observadores del centro de notificaciones?

  • ¿Cuáles son las preocupaciones especiales de las aplicaciones de subprocesos múltiples, especialmente con respecto al argumento 'objeto'?

  • ¿Cuáles son las diferencias en el comportamiento de este método en entornos con y sin GC?

  • ¿Existen diferencias significativas (desde la perspectiva del cliente) entre los entornos móviles y de escritorio en el comportamiento de este método?

Además, cualquier puntero a los artículos existentes que cubren esto sería muy apreciado. Busqué en Google, pero me sorprendió encontrar en profundidad discusión de estos temas (aunque tal vez no usé las palabras clave mágicas correctas).

+0

thx para editar chris. –

Respuesta

24

qué tipos de referencias son guardados por el centro de notificación de la 'observador' y 'objeto' argumentos?

Creo que una referencia débil, aunque eso es solo de memoria (sin juego de palabras).

¿cuáles son las mejores prácticas para la eliminación de observadores del centro notificación?

Elimine siempre el objeto registrado del centro de notificaciones antes de su lanzamiento. El método dealloc del objeto es un buen lugar para esto si configura el registro en sí mismo, o cuando lo libera si otro objeto está administrando las suscripciones de notificación. Tenga esto en cuenta y lo anterior no importará.

¿cuáles son las preocupaciones especiales para aplicaciones de subprocesos múltiples, WRT especialmente el argumento de 'objeto'?

NSNotificationCenter trabaja muy bien en las discusiones, pero si envía una notificación de un subproceso de fondo, el objeto de la recibirán en ese mismo hilo. Debido a este comportamiento, debe usar un enfoque diferente si está actualizando la IU o haciendo algo más que no sea seguro para subprocesos (o envíe la notificación desde otro método en el hilo principal).

¿cuáles son las diferencias en el comportamiento de este método en GC y GC no entornos?

No recuerdo haber oído nada de lo que deba preocuparse, aunque todavía no he usado el GC.

son las diferencias significativas (desde la perspectiva del cliente) entre entornos móviles y de escritorio en el comportamiento de este método?

No he oído hablar de, no. Cuando registra su objeto, puede optar por registrarse para todas las notificaciones o solo las notificaciones de un determinado objeto. Si utiliza notificaciones en gran medida, la última puede ser un poco más rápida, pero siempre realice una prueba para estar seguro.

Además, cualquier punteros a artículos existentes que cubren este serían muy apreciadas. Busqué en Google, pero se sorprendió al encontrar poca discusión en profundidad de estos asuntos (aunque quizás no usé las palabras clave mágicas correctas ).

Creo que es más porque NSNotificationCenter es bastante fácil de usar, en general. Si le preocupan ciertos casos, ¡no dude en escribir una aplicación de prueba rápida!

+1

Específicamente cuando usa NSNotificationCenter en GC no necesita emitir removeObserver: messages y cuando su objeto está finalizado, cualquier referencia que tenga el centro será eliminada. –

+0

De la documentación, 'NSNotificationCenter' utiliza una referencia insegura no retenida para todos los objetos involucrados (en oposición a la referencia débil de puesta a cero). Esto está implícito en el requisito de que 'removeObserver' debe llamarse antes de que cualquier objeto sea desasignado. – adib

8

situación actual en el año 2016:

iOS 9 has changedNSNotificationCenter tal que referencias débiles el objeto de destino.

Eso también quiere decir que ya no tiene que removeObserver cuando el objeto es dealloc.

Cuestiones relacionadas