0

У меня есть основной вопрос относительно удаления наблюдателя.iOS - Использование dealloc для удаления наблюдателя

У меня есть родительский класс ViewController, который наследуется тремя дочерними классами ViewController. например. BookVC -> BookHotelVC, BookFlightVC, BookTrainVC

Здесь я добавил наблюдатель в viewDidLoad родительского класса (я [super viewDidLoad] в детских ViewControllers), который уведомляет метод написанный в родительском классе. Мой код-

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(BookingCompleted:) name:@"BookingCompleted" object:nil]; 

Теперь я хочу, чтобы удалить наблюдателя, когда я отойти от любого из дочерних ViewControllers, но я не могу писать [super dealloc] в dealloc каждого ребенка ViewController, поскольку ARC не допускает этого.

Как удалить наблюдателя, который установлен? Потому что всякий раз, когда я перехожу к дочернему ViewController, добавляется новый наблюдатель, который вызывает странные вещи (например, вызов этого метода дважды/трижды ... - вызов предупреждения дважды/трижды ...).

Просьба предложить.

ответ

0

Только не звоните super! В ARC это не требуется (см. http://clang.llvm.org/docs/AutomaticReferenceCounting.html#dealloc).

-(void)dealloc { 

    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

} 
+0

Вы имеете в виду, я должен написать 'dealloc' в самом родительском классе? Если это так, я сделал это в первую очередь, но его не вызывали. – cheeseRoot

+0

@ pRimei5 Вы уверены, что все ссылки на этот объект были освобождены? –

1

Удаление наблюдателей в dealloc в порядке, не называют [super dealloc] (как вы видели, с поддержкой ARC, компилятор не позволит вам), просто написать:

- (void)dealloc { 
    [self removeYourObservers]; 
} 
+0

с ARC вы даже не можете явным образом вызвать dealloc :) –

+0

@ JulianKról обновил мой ответ, чтобы лучше отразить этот факт –

+0

словосочетание не подходит мне, вы просто не можете его использовать –

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