В моем маленьком 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 запрещает это, я сейчас застрял. Есть ли другой способ узнать, когда мой объект умирает?