iphone - pantalla - ¿Cuál es una mejor manera de eliminar el observador de notificaciones
recuperar notificaciones iphone (4)
A medida que el objeto se va, es seguro usar [[NSNotificationCenter defaultCenter] removeObserver:self];
en el método dealloc
.
En el método ViewDidUnload
, es mejor que elimines cada observador uno por uno, ya que todavía hay una referencia al controlador (y tu correspondiente viewDidLoad
debería viewDidLoad
agregarlos todos).
Usualmente uso NSNotification como la siguiente muestra:
En viewDidLoad:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(foo:) name:kName1 object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bar:) name:kName2 object:nil];
En viewDidUnload y dealloc:
[[NSNotificationCenter defaultCenter] removeObserver:self];
Pero un amigo me dijo que no debería usar [[NSNotificationCenter defaultCenter] removeObserver:self];
porque eliminará a todos los observadores incluyendo a la súper clase. Me sugirió usar el siguiente código para eliminar el observador uno por uno.
[[NSNotificationCenter defaultCenter] removeObserver:self name:kName1 object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kName2 object:nil];
He comprobado el código de la biblioteca ASIHttpRequest ( https://github.com/pokeb/asi-http-request ). Sigue la sugerencia de mis amigos.
Quiero saber si mi amigo tiene razón o no? En mi opinión, dado que la instancia actual será descargada o dealloc, la notificación de la súper clase también es inútil. ¿Y hay alguna subclase UIViewController de uso del sistema?
Cuando quieras eliminar todas las notificaciones que utilices,
[[NSNotificationCenter defaultCenter] removeObserver:self];
Si desea eliminar una notificación particular que utiliza,
[[NSNotificationCenter defaultCenter] removeObserver:self name:kName1 object:nil];
Cuando ya no necesita ninguna notificación, el primer enfoque es simple.
Tu amigo es 100% correcto. Sin embargo, no importa si elimina todas las observaciones de notificación en dealloc.
Mencionó viewDidUnload
, y en este caso el caso es completamente diferente, porque el objeto descargado permanecerá vivo y no se sabe cuándo se volverán a agregar las observaciones de notificación de la superclase. Si se agregan en viewDidLoad, no tendrá ningún problema. Si se agregan en un método de inicio, acaba de perder un montón de observaciones de notificación importantes.
Eliminar las observaciones con nombres específicos es una buena práctica y debe hacerse desde el principio.
Utilizo la primera forma, nunca pensé si era correcto o no. Si se llama a dealloc, entonces el objeto (super también) será desasignado de todos modos. Lo que definitivamente NO QUIERES es que la NSNotification se envíe a una instancia desasignada.