In meiner kleinen iPad-App habe ich eine "Sprache wechseln" -Funktion, die einen Beobachter verwendet. Jeder View Controller registriert sich während seiner Zeit bei meinem Beobachter viewDidLoad:
.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Wenn der Benutzer auf die Schaltfläche "Sprache ändern" klickt, wird die neue Sprache in meinem Modell gespeichert und der Beobachter wird benachrichtigt und ruft einen updateUi:
Selektor für seine registrierten Objekte auf.
Dies funktioniert sehr gut, außer wenn ich View-Controller in einem TabBarController habe. Dies liegt daran, dass beim Laden der Registerkartenleiste die Registerkartensymbole von den untergeordneten Controllern viewDidLoad:
abgerufen werden, ohne die Ansichten zu initialisieren. Sie werden daher nicht aufgerufen, sodass diese Ansichtscontroller keine Benachrichtigungen über Sprachänderungen erhalten. Aus diesem Grund habe ich meine registerObject:
Aufrufe in die init
Methode verschoben .
Als ich mich viewDidLoad:
bei meinem Beobachter registriert habe, habe ich mich immer viewDidUnload:
abgemeldet. Da ich mich jetzt anmelde init
, ist es sehr sinnvoll, sich abzumelden dealloc
.
Aber hier ist mein Problem. Wenn ich schreibe:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Ich bekomme diesen Fehler:
ARC verbietet das explizite Senden von Nachrichten von 'Dealloc'
Da ich anrufen muss, [super dealloc]
um sicherzustellen, dass die Superklassen ordnungsgemäß aufgeräumt werden, ARC dies jedoch verbietet, stecke ich jetzt fest. Gibt es eine andere Möglichkeit, sich zu informieren, wenn mein Objekt stirbt?
Antworten:
Wenn Sie ARC verwenden, rufen Sie einfach nicht
[super dealloc]
explizit auf - der Compiler übernimmt dies für Sie (wie im ARC-Dokument Clang LLVM, Kapitel 7.1.2 beschrieben ):quelle
dealloc
wird niemals aufgerufen. Ist es sinnvoll, einen[observer unregisterObject:self]
Dealloc einzuholen? Was vermisse ich?