У моєму маленькому додатку 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 забороняє це, я зараз застряг. Чи є інший спосіб отримати інформацію, коли мій предмет помирає?