removeObserver с NSNotification …, что я делаю неправильно?

В основном у меня есть view1 который в какой-то момент, view2 вызовов (через presentModalViewController:animated:). Когда определенное UIButton в view2 нажимается, view2 является вызовами метод уведомления в view1 и сразу позже отклонен. Метод уведомления открывается предупреждение.

Метод уведомления хорошо работает и назван соответственно. Проблема, каждый раз view1 создается (только один view1 должен существовать за один раз), я, по-видимому, получаю другого NSNotification будучи созданным, потому что, если я иду от view0 (меню) к view1, затем обратно и дальше несколько раз, я получаю ряд того же аварийного сообщения, один за другим, из метода уведомления так много раз, как я открыл view1.

Вот мой код, скажите мне, что я делаю неправильно:

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];
}
27
задан JasonMArcher 24 June 2015 в 03:56
поделиться

1 ответ

Вызов -dealloc не происходит автоматически после удаления контроллера представления - во времени жизни контроллера представления еще может оставаться некоторая "жизнь". В этот промежуток времени контроллер представления все еще подписан на это уведомление.

Если вы удалите наблюдателя в -viewWillDisappear: или -viewDidDisappear:, это будет иметь более немедленный эффект:

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                    name:@"alert" 
                                                  object:nil];
}
60
ответ дан 28 November 2019 в 04:35
поделиться