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.