uiapplicationdidbecomeactivenotification observer notification defaultcenter objective-c ios cocoa-touch nsnotifications nsnotificationcenter

objective c - observer - Eliminación de un observador NSNotificationCenter en iOS 5 ARC



observer swift (3)

"También necesito que las notificaciones de devolución de llamada aún se activen si la vista está fuera de pantalla" -> es posible que deba registrar UIApplicationWillEnterForegroundNotification. Si es así, vamos a intentar esto:

- (void)viewWillAppear:(BOOL)animated { NSLog(@"viewWillAppear"); [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; } - (void)viewWillDisappear:(BOOL)animated { NSLog(@"viewWillDisappear"); [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; } - (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"applicationWillEnterForeground"); [[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; // do your stuff here } - (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"applicationDidEnterBackground"); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; }

La idea es agregar o eliminar UIApplicationDidEnterBackgroundNotification cada vez que entra y sale de su pantalla. Solo registramos UIApplicationWillEnterForegroundNotification cuando la aplicación ingrese el fondo y la elimine una vez que esté de vuelta. Tenga en cuenta que solo eliminamos UIApplicationDidEnterBackgroundNotification cuando viewWillDisappear.

Mi dealloc () no es llamado de alguna manera, así que lo encontré de esta manera, espero que también sea útil para ti.

Disfrutar :)

Tengo un proyecto basado en ARC de iOS 5 y tengo dificultades con respecto a dónde debería eliminar el observador de las observaciones del NSNotificationCenter que he registrado en un UIViewController . -dealloc similares en SO han dicho que esto debería hacerse en el método -dealloc . Aunque este método no es obligatorio en los proyectos ARC, lo he agregado con el siguiente código:

- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }

Como prueba, abro el UIViewController (dentro de un UINavigationController ), hago algunas cosas que activan las notificaciones y luego lo UINavigationController de la pila presionando el botón Atrás. Luego vuelvo a abrir UIViewController y hago algunas cosas más para activar las notificaciones, pero me UIViewController cuenta de que cada devolución de llamada se está realizando dos veces, una indicación de que las notificaciones anteriores no se han cancelado. La repetición de este procedimiento solo hace que cada devolución de llamada se llame más de una vez, por lo que parece que nunca se anula el registro.

¡Cualquier ayuda sería apreciada!


Está bastante claro que no se está llamando a su método dealloc (ni tampoco a la llamada removeObserver ).

¿Por qué no eliminar el observador de viewDidUnload: en los viewDidUnload: o viewWillDisappear: :?


Si no se llama a su dealloc, es probable que alguien todavía tenga una referencia al controlador de vista. ¿Quizás necesitas marcar algo como __weak ? Puede usar el instrumento de asignaciones para ayudar a rastrear lo que se mantiene en su controlador de vista.