Пользовательский dealloc и ARC (Objective-C)

В моем маленьком iPad-приложении у меня есть функция "switch language", которая использует наблюдателя. Каждый контроллер просмотра регистрируется с моим наблюдателем во время viewDidLoad:.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}

Когда пользователь нажимает кнопку "изменить язык", новый язык сохраняется в моей модели, и наблюдатель уведомляется и вызывает селектор updateUi: на своих зарегистрированных объектах.

Это работает очень хорошо, за исключением тех случаев, когда у меня есть контроллеры представлений в TabBarController. Это происходит из-за того, что, когда загружается панель вкладок, она извлекает значки вкладок из своих дочерних контроллеров без инициализации представлений, поэтому viewDidLoad: не вызывается, поэтому эти диспетчеры просмотра не получают уведомлений об изменении языка. Из-за этого я переместил вызовы registerObject: в метод init.

Назад, когда я использовал viewDidLoad: для регистрации у своего наблюдателя, я использовал viewDidUnload: для отмены регистрации. Поскольку я сейчас регистрируюсь в init, имеет смысл отменить регистрацию в dealloc.

Но вот моя проблема. Когда я пишу:

- (void) dealloc
{
    [observer unregisterObject:self];
    [super dealloc];
}

Я получаю эту ошибку:

ARC запрещает явное сообщение отправки 'dealloc'

Поскольку мне нужно позвонить [super dealloc], чтобы убедиться, что суперклассы очищены правильно, но ARC запрещает это, я сейчас застрял. Есть ли другой способ узнать, когда мой объект умирает?

Ответ 1

При использовании ARC вы просто не вызываете [super dealloc] явно - компилятор обрабатывает его для вас (как описано в документе Clar LLVM ARC, глава 7.1.2):

- (void) dealloc
{
    [observer unregisterObject:self];
    // [super dealloc]; //(provided by the compiler)
}