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 init
metody.
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?
Odpowiedzi:
Podczas korzystania z ARC po prostu nie wywołujesz
[super dealloc]
jawnie - kompilator obsługuje to za ciebie (jak opisano w dokumencie ARC Clang LLVM, rozdział 7.1.2 ):źródło
dealloc
nigdy nie jest wywoływana. Czy warto zadzwonić[observer unregisterObject:self]
dealloc? czego mi brakuje?