Resumen de uso de NSNotificationCenter
El centro de notificaciones es más familiar para los desarrolladores de iOS. Implementa la entrega de mensajes de uno a varios y puede lograr la entrega entre páginas. Los métodos principales de NSNotificationCenter son los siguientes:
El último método devuelve un objeto NSObserver. Cuando utilice este método para agregar un observador, debe prestar atención a la referencia circular y a los métodos de eliminación. Cada método funciona de manera diferente en diferentes sistemas.
El observador en este método es una referencia débil. El uso directo de uno mismo, etc., no generará una referencia fuerte. Aquí hay un recordatorio. Si la misma notificación se agrega n veces seguidas, el SEL. El método se llamará n veces. Así que asegúrese de que addObserver y removeObserver aparezcan en pares. Por ejemplo:
Al enviar una notificación de prueba, el método de prueba se llamará tres veces.
Este método debe prestar atención a los siguientes puntos:
1) Este método devolverá un objeto NSObserver, que está fuertemente retenido por el sistema. La persona que llama debe retener este objeto. para Se utiliza al detener notificaciones para eliminar a un observador. La notificación agregada de esta manera no se puede destruir por completo si el objeto no se retiene. El método específico es el siguiente:
2) El bloque en este método retendrá el objeto por la fuerza, por lo que en el bloque Variables miembro. y las propiedades requieren referencias débiles. Si no hay referencias débiles, la notificación debe eliminarse antes de la función de asignación; de lo contrario, la función de asignación no se ejecutará.
Hay tres formas principales de enviar notificaciones:
1. Aquí debes prestar atención al hilo donde se envía la notificación. Si la notificación se envía en un hilo secundario, la notificación también se recibe en el hilo secundario.
2. Preste atención al parámetro del objeto al enviar notificaciones. Esto tiene algo que ver con el método utilizado durante el registro. También hay un parámetro de objeto en el método de registro. p> Los dos anteriores Los nombres de ambas notificaciones de registro son lala. La única diferencia es que un objeto es nulo y el otro es _name. Hay dos formas diferentes de enviar notificaciones:
Primero:
Al enviar notificaciones de esta manera, solo se llamará al método test2.
Segundo método:
Cuando este método envía una notificación, se llamará tanto a test1 como a test2. ¿Qué pasará si cambio _name en este momento?
En este momento, solo se llama a test2. Debido a que se cambió la dirección de _name, la notificación no puede coincidir, lo que hace que no se reconozca test1. Lo anterior puede ilustrar que si se pasa el parámetro del objeto al agregar una notificación, cuando se envía la notificación, las dos condiciones de nombre y objeto coincidirán. Si no se pasa ningún parámetro de objeto, solo coincidirá el nombre.
De repente descubrí que el método de eliminación también tiene este parámetro de objeto. En aras de la continuidad de las ideas, el método para eliminar la notificación está escrito aquí.
De acuerdo con el método anterior, se agregan dos notificaciones, una que lleva el parámetro del objeto y otra que no lleva el parámetro del objeto. Primero elimínela de acuerdo con las siguientes operaciones:
El resultado en. esta vez es el método test1 La notificación se elimina, pero el método test2 no. ¿Qué pasa si _name se modificó antes de eliminarlo?
Encontrará que el efecto es el mismo en este momento. Incluso si la dirección de _name cambia, la notificación de prueba1 aún se elimina, pero la notificación de prueba2 no. Si se elimina según el siguiente método:
En este momento, se han eliminado tanto la prueba1 como la prueba2. Si usa
, el efecto es el mismo. La diferencia es que este método no solo eliminará el método de notificación que agregó, sino que también eliminará el método de notificación del sistema, por lo que, a menos que el objeto deba ser liberado, hágalo. No utilices este método para eliminar notificaciones fácilmente.
1. Si se pasa el parámetro del objeto al agregar una notificación, las dos condiciones de nombre y objeto coincidirán cuando se envíe la notificación. Si no se pasa ningún parámetro de objeto, solo coincidirá el nombre.
2. Si el objeto se modifica a mitad de camino, la notificación enviada a través de [[NSNotificationCenter defaultCenter] postNotificationName:@"lala" object:_name] no será válida.
3. Al eliminar la notificación, si existen tanto el nombre como el objeto en eliminar, entonces se eliminarán aquellos inicializados de esta manera y con el mismo nombre. Si solo hay un nombre en eliminar, se eliminarán todas las notificaciones bajo este nombre.
4. [[NSNotificationCenter defaultCenter] removeObserver:self]; no solo eliminará las notificaciones agregadas por usted mismo, sino que también eliminará las notificaciones agregadas automáticamente por el sistema, por lo que, a menos que la clase se publique, tenga cuidado. este método.
Como se explicó en el envío de notificaciones, hay dos formas principales de eliminar notificaciones:
Agregar una categoría a NSNotificationCenter y vincular el método del sistema para eliminar notificaciones
A través Al imprimir registros, encontraremos que en sistemas superiores a iOS8, la clase ViewController llama automáticamente al método removeObserver después de dealloc.
Después del sistema iOS9, cuando se libera el objeto, si usa SEL para agregarlo, no habrá ningún impacto si no se elimina la notificación. Antes del sistema iOS9, si el objeto no se eliminaba cuando se liberaba, enviar una notificación después de que se liberaba el objeto podía provocar que el puntero comodín fallara. Por lo que se recomienda eliminarlo.
Si utiliza el método Bloquear para agregar, debe retener el objeto y realizar la operación de liberación manualmente al liberarlo. De lo contrario, el objeto se liberará, pero cuando se envíe la notificación, el bloqueo seguirá estando activo. Liberado, en este momento el objeto self en bolck ya es nulo.