7 Stimmen

Warum sollte ich kurz vor dem Beenden der Anwendung Objekte freigeben (und damit deallocieren)?

Es gibt viele Objekte in jeder iPhone-App, die ewig leben werden, bis die App stirbt. Das sind: Anwendungsdelegierter, Fenster, Haupt-View-Controller, eventuell Navigations- oder Tab-Controller und alle Objekte darin. Warum um alles in der Welt sollte ich sie freigeben, kurz bevor ich aufhöre, wertvolle CPU-Zyklen zu verbrauchen? Soweit ich verstehe, werden Apps Prozess beendet werden, so dass es Heap, konsistent oder nicht wird auch weg sein.

Warum sollte ich sie also freigeben? Apples Entwicklungshandbücher bestehen darauf, wie im folgenden Codebeispiel (aus Leitfaden zur iPhone-Entwicklung ). Es ist nur der erste Ort, an dem ich die Suche nach einem Wort gefunden habe dealloc in der Bibliothek.

@implementation HelloWorldAppDelegate
@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    // Override point for customization after app launch
    MyView *view = [[MyView alloc] initWithFrame:[window frame]];
    [window addSubview:view];
    [view release];
    [window makeKeyAndVisible];
}
- (void)dealloc {
    [window release];
    [super dealloc];
}
@end

Aus dem Abschnitt "Diskussionen" auf NHObject-dealloc Methode:

Beachten Sie, dass bei der Beendigung einer Anwendung die Objekte darf nicht Es ist effizienter, dem Betriebssystem zu erlauben, die Ressourcen zu bereinigen, als alle Speicherverwaltungsmethoden aufzurufen. Aus diesem und anderen Gründen sollten Sie knappe Ressourcen nicht in dealloc

Aber dealloc Methode im obigen Beispiel wird in der aktuellen Implementierung aufgerufen, wenn Ihre Anwendung schnell genug ist, um innerhalb von 15 Sekunden auf applicationWillTerminate zu reagieren.

Also noch einmal. Sollte ich vermeiden, schreiben dealloc Methode oben für app beenden Geschwindigkeit oder gibt es irgendwelche Probleme mit solchen Ansatz?

6voto

Denn du wirst es wissen, Artem.

Spielen wir ein kleines Spiel namens "Was wäre wenn".

Was wäre wenn Sie entwickeln eine tolle App. Eine meisterhafte App, wirklich - und die Öffentlichkeit liebt sie! Ihre Umsätze steigen, die Vögel singen Ihren Namen in den Himmel!

Aber Sie haben sich entschieden, in Ihrem AppDelegate dealloc nichts zu tun. Nur ein paar Sekunden Zeit, mit denen Sie sich nicht beschäftigen wollen. Was ist der Schaden?

Zuerst schläft man ruhig auf den Geldbergen. Aber wenn die Umsätze steigen und steigen, kommt ein kleiner Stich. Und dann beginnen die Träume.

Quadratische Formen, zunächst undeutlich. Die Tage vergehen und sie werden immer deutlicher, während Sie immer weniger schlafen. Dann endlich, eines Tages, sehen Sie.

Das sind Blöcke, Artem. Speicherblöcke . Und was machen sie in deinen Träumen? Nun, sehen Sie, nicht ganz aus der Existenz befreit, bevor die Anwendung beendet, mussten sie irgendwo hingehen. Die Anwendung war weg, das Telefon war weitergezogen.

Sie zogen also in Ihr KOPF . Und jeden Tag werden es mehr, so dass immer weniger Platz für SIE SELBST .

Ich hoffe, dies war informativ... Artem.

4voto

Alex Punkte 26769

Ich glaube, die einzige Antwort, die für mich Sinn macht, ist "Konsistenz". Nein, Sie müssen vielleicht nicht immer dealloc Aber wenn Sie es immer tun, werden Sie es nicht vergessen, wenn es darauf ankommt. Außerdem ist es nicht so, dass es Sie mehr als 30 Sekunden kostet, zwei Zeilen Code zu schreiben, die vielleicht nicht aufgerufen werden.

Es ist auch sehr unwahrscheinlich, dass Sie Ihre kostbaren CPU-Zyklen verschwenden (die übrigens nicht so kostbar sind, dass Sie jemals einen Unterschied bemerken würden). Diese iPhone-Animationen dienen hauptsächlich dazu, Ihrer Anwendung Zeit zu verschaffen, um sie zu starten/beenden), denn wenn die Anwendung beendet wird, macht sie sich normalerweise nicht die Mühe dealloc Objekte, weil, wie Sie sagen, die Zeit der Speicherzuweisung dieses Heaps vorbei ist.

Also, ja, dealloc ist es unwahrscheinlich, dass er jemals bei einem UIApplicationDelegate aber kostet es Sie überhaupt etwas? Eigentlich nicht.

3voto

mousebird Punkte 1029

Der beste Grund ist die Wiederverwendung. Es besteht die Möglichkeit, dass Sie einen Gegenstand von einem Ort zum anderen bringen oder ihn wiederverwenden. Wenn Sie das tun, sollten Sie sicherstellen, dass alle Punkte richtig gesetzt sind und alle Punkte richtig markiert sind.

Es ist auch einfach eine gute Angewohnheit. Wenn Sie daran denken, es dort zu tun, werden Sie es überall tun.

0voto

zaph Punkte 110105

Denn es ist möglich, dass eine Klasse, die freigegeben wird, einen Nebeneffekt hat, wie z. B. das Speichern des Zustands in ihrer dealloc-Methode oder einer ihrer Superklassen. Dem Betriebssystem sollte das egal sein, es sollte alle Ressourcen zurückfordern, egal was passiert.

0voto

Chuck Punkte 228137

Das Codebeispiel, das Sie gepostet haben, besteht nicht darauf, etwas freizugeben, wenn die Anwendung beendet wird. Wenn Sie an die dealloc-Methode denken, wird diese nicht aufgerufen, wenn die App beendet wird.

An mehreren Stellen in der Dokumentation weist Apple darauf hin, dass das Nicht-Senden von dealloc beim Beenden eine absichtliche Design-Entscheidung ist, weil es, wie Sie sagten, viel effizienter ist, einfach den gesamten Adressraum freizugeben. Siehe die Diskussion über die Dealloc-Dokumente .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X