В моем маленьком приложении для iPad есть функция «переключения языка», в которой используется наблюдатель.Каждый контроллер представления регистрируется в моем наблюдателе во время его 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 запрещает это, я застрял.Есть ли другой способ получить информацию, когда мой объект умирает?