4 Stimmen

Lernen Sie das Obj-C-Speichermanagement

Mögliche Duplikate:
Wo finden Sie die besten Erklärungen zum Speichermanagement für das iPhone?

Ich komme aus dem Bereich der Webentwicklung. Ich bin gut in XHTML, CSS, JavaScript, PHP und MySQL, weil ich all diese Technologien bei meiner Arbeit verwende.

In letzter Zeit habe ich abends und am Wochenende mit Obj-C in Xcode herumexperimentiert. Ich habe Code sowohl für das iPhone als auch für Mac OS X geschrieben, aber ich kann mich nicht mit den praktischen Aspekten des Speichermanagements anfreunden. Ich verstehe die Konzepte auf hoher Ebene, bin jedoch unklar darüber, wie sich dies in der Implementierung auswirkt. Webentwickler müssen sich in der Regel keine Gedanken über solche Dinge machen, daher ist es für mich ziemlich neu.

Ich habe versucht, das Speichermanagement in meine Projekte aufzunehmen, aber meistens stürzen die Dinge dann ab. Irgendwelche Vorschläge, wie man das lernen kann? Alle Vorschläge sind willkommen.

3voto

Shawn Craver Punkte 1986

Über die offiziellen Apple-Ressourcen, die im Post von arul verlinkt sind, hinaus gibt es hier noch einige weitere interessante Artikel zum Thema:

Hold me, use me, free me
Der Abschnitt zur Speicherverwaltung von CocoaDev.com

Und für Hilfe bei der Debugging von Speicherverwaltungsproblemen:
NSZombieEnabled

2voto

Georg Schölly Punkte 120083

Daumenregeln

Autorelease

Jedes Mal, wenn Sie [[NSObject alloc] init] verwenden, wickeln Sie es in ein autorelease:

// Stellen Sie sicher, dass es ordnungsgemäß freigegeben wird
// autorelease gibt das Objekt zu einem späteren Zeitpunkt frei.
NSObject *instance = [[[NSObject alloc] init] autorelease];

Dinge wie diese (ich erinnere mich nicht an den Ausdruck) werden immer automatisch freigegeben, Sie sollten Ihre Klassen so erstellen, dass sie dieser Regel entsprechen:

NSString *test = [NSString stringWithFormat:@"%i", 4];

Retain / Release

Wenn Sie ein Objekt länger als die aktuelle Methode speichern müssen, behalten Sie es bei:

[instance retain];

Wenn Sie es nicht mehr benötigen oder gegen ein anderes Objekt ausgetauscht haben:

[instance release];

Sie sollten immer die gleiche Anzahl von retains wie releases in Ihrem Code haben.

Accessors

Objective-C 2.0 ermöglicht es Ihnen, Eigenschaften zu deklarieren und schreibt Ihre Accessoren für Sie. Zum Beispiel sieht @property(retain, readwrite) NSString *text; etwa so aus:

- (NSString *)text {
    return text; // Ich mag es nicht, Variablen _test zu nennen
}

- (void)setText:(NSString *)newText {
    [newText retain];
    [text release];
    text = newText;
}

init / dealloc

In diesen Methoden sollten Sie immer [self setVariable:…] verwenden, so wie hier:

- (id)init {
    if (self = [super init]) {
        [self setText:@"Lorem ipsum dolor sit amet."];
        // …
    }
    return self;
}

- (void)dealloc {
    // Stellen Sie sicher, dass text auf nil gesetzt ist und der alte Wert freigegeben wird.
    [self setText:nil];
}

Garbage Collector

Verwenden Sie den Garbage Collector, der in Objective-C 2.0 integriert ist, es lohnt sich kaum, ihn nicht zu verwenden, wenn Sie können.

Wie funktioniert dieses retain / release überhaupt?

Jedes Mal, wenn Sie ein Objekt allozieren1, wird der Retain-Zähler auf 1 gesetzt. Wenn dieser Zähler auf 0 fällt, wird das Objekt gelöscht. [instance retain] erhöht den Zähler um 1 und [instance release] verringert den Zähler um 1.

1 [instance copy] alloziert auch eine neue Instanz und hat daher auch einen Retain-Zähler von 1.

1voto

Marc Charbonneau Punkte 40221

Das Speichermanagement in Cocoa ist tatsächlich ziemlich einfach dank des retain / release-Paradigmas. Beginnen Sie damit, das Konzept der Zeiger zu erlernen - auch wenn Sie kein Experte in C sein müssen, um Objective-C zu lernen, ist es wichtig, Zeiger zu verstehen. Lesen Sie dann dies (oder einen anderen) Leitfaden. Notieren Sie sich die Regeln, wenn Sie müssen, wann Sie ein Objekt behalten sollten und wann nicht, und mit ein wenig Übung sollten Sie es in kürzester Zeit "verstehen".

Denken Sie daran, dass Sie die Garbage Collection aktivieren könnten und sich nicht so sehr um das Speichermanagement kümmern müssten, aber ich würde das nicht empfehlen; selbst wenn GC aktiviert ist, gibt es immer noch Zeiten, in denen Sie verstehen müssen, was hinter den Kulissen passiert.

1voto

EightyEight Punkte 3390

Lies den Link, den Arul bereitgestellt hat. Jetzt, da Sie eine Sprache verwenden, die keine automatische Speicherbereinigung hat (wenn Sie für das iPhone entwickeln), ist es Zeit, über die Lebensdauer von Objekten nachzudenken. Jedes Objekt, das Sie instanziieren, muss von jemandem deallokiert werden, wahrscheinlich (möglicherweise) von Ihnen. Die Speicherverwaltung ist kein einfaches Thema und der einzige Weg, um damit umzugehen, besteht darin zu üben. Spielen Sie damit herum, ein Objekt zuzuweisen und es freizugeben. Beobachten Sie, wie die Retain-Zähler wachsen, wenn Sie ein Objekt zu einer Sammlung hinzufügen. Schauen Sie sich Autorelease-Pools an. Im Grunde sollten Sie wissen, wo und wann ein Objekt zugewiesen UND deallokiert wird. Auf Systemen mit begrenztem Speicher (wie dem iPhone) möchten Sie, dass ein Objekt so schnell wie möglich verschwindet.

Mein Vorschlag wäre, ein paar Tage damit zu verbringen, mit der Speicherverwaltung zu spielen, bevor Sie mit dem Großteil Ihrer Anwendung beginnen. Das Debuggen von Speicherproblemen und der Kampf mit der Anwendungslogik ist etwas lästig.

0voto

Ian Turner Punkte 1333

Ich habe den Videokurs zum Speichermanagement von der Mac Developer Network benutzt. Hat mir genau das gegeben, was ich brauchte, als ich anfing. Es zahlte sich sofort aus, als ich begann, meine eigenen Speicherverwaltungsprobleme zu haben.

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