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