W mojej małej aplikacji na iPada mam funkcję „zmień język”, która korzysta z obserwatora. Każdy kontroler widoku rejestruje się u mojego obserwatora podczas jego viewDidLoad:.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Gdy użytkownik naciśnie przycisk „zmień język”, nowy język jest zapisywany w moim modelu, a obserwator zostaje powiadomiony i wywołuje updateUi:selektor zarejestrowanych obiektów.
Działa to bardzo dobrze, z wyjątkiem sytuacji, gdy mam kontrolery widoku w TabBarController. Dzieje się tak, ponieważ gdy pasek kart ładuje się, pobiera ikony kart ze swoich kontrolerów podrzędnych bez inicjowania widoków, więc viewDidLoad:nie jest nazywany, więc te kontrolery widoków nie otrzymują powiadomień o zmianie języka. Z tego powodu przeniosłem swoje registerObject:wywołania do initmetody.
Kiedy viewDidLoad:rejestrowałem się u mojego obserwatora, viewDidUnload:wyrejestrowywałem się. Ponieważ teraz się rejestruję init, wyrejestrowanie się z systemu ma sens dealloc.
Ale oto mój problem. Kiedy piszę:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Otrzymuję ten błąd:
ARC zabrania jawnego wysyłania wiadomości „dealloc”
Ponieważ muszę zadzwonić, [super dealloc]aby zapewnić prawidłowe czyszczenie nadklas, ale ARC zabrania tego, teraz utknąłem. Czy istnieje inny sposób uzyskania informacji o śmierci mojego obiektu?