ios objective-c nsnotification

ios - notificationcenter swift 4



removeObserver with NSNotification... ¿qué estoy haciendo mal? (3)

La llamada -dealloc no ocurre automáticamente después de que se despide el controlador de vista; aún puede haber algo de "vida" en la vida útil del controlador de vista. En ese período de tiempo, el controlador de vista aún está suscrito para esa notificación.

Si eliminas el observador en -viewWillDisappear: o -viewDidDisappear: esto tendrá un efecto más inmediato:

- (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:@"alert" object:nil]; }

Básicamente, tengo una vista1 que en algún punto, llama vista2 (a través de presentModalViewController:animated: :). Cuando se presiona un determinado UIButton en view2, view2 llama a un método de notificación en view1 y se desactiva inmediatamente después. El método de notificación aparece una alerta.

El método de notificación funciona bien y se llama adecuadamente. El problema es que cada vez que se crea view1 (solo debe existir una view1 a la vez), probablemente se NSNotification otra NSNotification porque si paso de view0 (el menú) a view1, y luego varias veces, recibo una serie del mismo mensaje de alerta, uno tras otro, del método de notificación tantas veces como abrí una vista1.

Aquí está mi código, por favor dime qué estoy haciendo mal:

View1.m

-(void) viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showAlert:) name:@"alert" object:nil]; } -(void) showAlert:(NSNotification*)notification { // (I''ve also tried to swap the removeObserver method from dealloc // to here, but it still fails to remove the observer.) // < UIAlertView code to pop up a message here. > } -(void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; }

View2.m

-(IBAction) buttonWasTapped { [[NSNotificationCenter defaultCenter] postNotificationName:@"alert" object:nil]; [self dismissModalViewControllerAnimated:YES]; } -(void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; }


No hay nada de malo en dealloc removeObserver: en dealloc . Solo el hecho de que no se llame significa que view1 no se publica correctamente después de descartar. Parece que algo mantiene el puntero en su vista1, verifique los ciclos de retención.

Además, no debes llamar a dealloc en super.


Si implementa la eliminación de Observer en viewWillDisappear: o viewDidDisappear: entonces no debe dejar la adición del observador en viewDidLoad .

En su lugar, coloque la adición del observador en viewWillAppear: El problema que tiene es que cuando se muestre cualquier vista de UIViewController , se UIViewController la eliminación de su observador y, dado que agregó observador en viewDidLoad lo que ocurrirá solo una vez, se perderá.

Tenga en cuenta que este enfoque funciona bien para los objetos que no desea observar, mientras que su vista principal no está en primer plano.

También viewDidUnload en cuenta que viewDidUnload se ha depreciado.