Zuweilen verwalten Instanzen eine externe Ressource. Wird das Objekt zerstört, so muss diese Ressource freigegeben werden. Die Verwaltung teilt also die Lebensdauer der Instanz.
Da ist -dealloc verführerisch: Weil es garantiert bei der Instanzzerstörung aufgerufen wird,könnte man dort ja gleich die Ressource freigeben. So blinzelt es uns an, und wackelt mit dem Popo, wenn wir etwas aufräumen müssen: »Nimm mich!«
Aber das ist falsch. -dealloc ist kein Finalisierer. Es dient nicht dazu, irgendwelche Ressourcen freizugeben. Es dient alleine dazu, das Reference-Counting in Schuss zu halten. Es wird auch nicht in jedem Fall bei der Speicherfreigabe aufgerufen. Das ist sofort ersichtlich:
1. Bei der Hammerschlagmethode des Aufräumens bei Programmquittierung ist es nicht erforderlich, noch -dealloc-Nachrichten an die vorhandenen Instanzen zu schicken. Wozu?
2. Garbage-Collection
Und genau der zweite Punkt zeigt die wahre Bedeutung von -dealloc. Es ist dazu gedacht, das Reference-Counting durchzuführen. Bei Garbage-Collection existiert kein Reference-Counting. Also wird auch kein -dealloc ausgeführt. Punkt. So einfach ist das.
Man mag anmerken, dass man zumindest Anwendungsprogramme nicht parallel für Reference-Counting und Garbage-Collection entwickeln sollte. Stimmt. Darum geht es aber nicht: Es geht darum, dass ein funktionaler Bestandteil der Applikation nicht von dem Speicherverwaltungssystem abhängen sollte. Vom Speicherverwaltungssystem hängt die Speicherverwaltung ab.
Natürlich existiert zuweilen das Problem des ordentlichen Aufräumens. Und in diesen Notfällen wird bei Garbage-Collection die Finalisierung mittels -finalize angeboten. Aber: Finalisierung ist Teufelswerk. Bekanntester Grund: Der Zeitpunkt und die Reihenfolge sind unbestimmt.
Man kann sich vielleicht eine Regel bilden: Wenn man bei Garbage-Collection ausnahmsweise den Fall einer Finalisierung hat, kann man bei Reference-Counting ausnahmsweise mal an Funktionalität in -dealloc denken.
Das ist aber die Ausnahme. Eigentlich sollten derlei Freigaben vor -dealloc explizit ausgeführt werden. Wer's nicht glaubt, mag mal eine Instanz freigeben, wenn er noch eine Observierung darauf hält – und in die Konsole schauen. Man muss eben die Observierung vor der Freigabe explizit aufgeben.
Und wieso heißt der Artikel +dealloc und nicht -dealloc? Nun, es gibt ja auch Klassenobjekte. Auch diese werden (mit +initialize) initialisiert. Sie werden aber nie deinitialisiert, es existiert keine Klassenmethode +dealloc. Wieso ist das so?
1. Klassenobjekte unterliegen wegen ihrer (von der Applikation aus betrachtet:) unendlichen Lebensdauer dem obigen Hammerschlag.
2. Klassenobjekt benötigen daher kein Reference-Counting. Also gibt es auch kein +dealloc zur Durchführung des Reference-Countings. Punkt. So einfach ist das.