В моем маленьком приложении для 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 запрещает это, я застрял. Есть ли другой способ получить информацию, когда мой объект умирает?
Ответы:
При использовании ARC вы просто не вызываете
[super dealloc]
явно - компилятор обрабатывает его для вас (как описано в документе Clang LLVM ARC, глава 7.1.2 ):источник
dealloc
никогда не вызывается. Имеет ли смысл звонить[observer unregisterObject:self]
в dealloc? Чего мне не хватает?