2013-02-27 3 views
2

Я добавил NSNotificationCenter в viewDidLoad метод и удален в viewDidUnload, но он не удаляется. Я следую за ARC. Я последовал за несколькими ответами, но мне не повезло. У меня нет репутации для комментариев, поэтому публикация какой-то вещи выглядит как дубликат. Пожалуйста, не голосуйте.Наблюдатель NSNotificationCenter не удаляется?

Пример кода:

- (void)viewDidLoad 
{  
    [[NSNotificationCenter defaultCenter ] addObserver:self.containerView 
               selector:@selector(loadInitialScreen) 
                name:CLEARSCREEN_DEPOSIT 
               object:NULL]; 
} 

- (void)viewDidUnload 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self.containerView 
                name:CLEARSCREEN_DEPOSIT 
                object:nil]; 

} 
+0

не слишком хорошо знакомы с этим, но, видя, NULL в Obj-C всегда красный флаг – JoshRagem

+1

Вы уверены, что вид разгружается? –

ответ

1

Попробуйте использовать viewDidDisappear вместо viewDidUnload:

-(void)viewDidDisappear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self.containerView 
                name:CLEARSCREEN_DEPOSIT object:nil]; 
    [super viewDidDisappear:animated]; 
} 
+0

В чем разница? – trojanfoe

+0

@trojanfoe проверить гравер. Извините за поздний ответ. Я был на обед. – Rushi

4

Вы должны удалить наблюдателя либо в -viewWillDisappear:, -viewDidDisappear: или в методе -dealloc, в зависимости от ваших потребностей. Причина в том, что -viewDidUnload в iOS6 + больше никогда не вызывается, и до iOS6 он вызывается при получении предупреждения о памяти.

+0

Да, но я видел, где -dealloc метод не полезен, когда мы используем ARC? Я попробую с viewWillDisappear. Спасибо @graver –

+2

Метод '-dealloc' полностью полезен для' ARC', особенно для незарегистрированных наблюдателей, освобождения объектов C и т. Д. Единственное, что вы не должны (и на самом деле не можете), вызывать '[super dealloc]; 'в конце. – graver

0

viewDidUnload вызывается (для < iOS 6.0), когда в контроллер приложения/представления принимается предупреждение о сохранении памяти. Он не будет вызван для удаления представления, так как вызывается dealloc. Но поскольку вы используете ARC, вы не можете реализовать метод dealloc.

Лучшая ставка заключается в том, чтобы удалить наблюдателя в методе loadInitialScreen, если он должен быть вызван только один раз.

Если уведомление может быть размещен несколько раз, то лучше удалить наблюдателя в viewDidDisappear, но затем добавить наблюдателя для уведомления в ViewWillAppear

Смежные вопросы