Es geht nicht um die Frage, ob man die automatische Freigabe verwenden soll oder nicht, denn in manchen Fällen ist die automatische Freigabe die einzige Möglichkeit, um weiterzukommen. Die Frage sollte lauten " Warum wird die automatische Freigabe nicht für alle Objekte verwendet, sondern nur für die Beibehaltung und Freigabe? ".
Um diese Frage zu beantworten, sollten Sie zunächst wissen, wofür die automatische Freigabe sinnvoll ist. Nehmen wir an, Sie haben eine Klasse, die zwei Eigenschaften hat: Vorname und Nachname. Für jede gibt es einen Getter und einen Setter. Aber Sie brauchen auch eine Methode, die fullName zurückgibt, indem sie diese beiden Strings zu einem brandneuen String verkettet:
- (NSString *) fullName {
NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
// this is not good until we put [str autorelease];
return str;
}
Was ist an diesem Bild falsch? Der Referenzwert der zurückgegebenen Zeichenkette ist 1. Wenn Sie also kein Leck haben wollen, sollte der Aufrufer die Zeichenkette freigeben, wenn er fertig ist. Vom Standpunkt des Aufrufers aus gesehen hat er gerade einen Eigenschaftswert angefordert fullName
. Er ist sich der Tatsache nicht bewusst, dass er ein brandneues Objekt erhalten hat, das er nach der Verwendung freigeben sollte, und nicht einen Verweis auf einen NSString, der intern von der Klasse gehalten wird!
Wenn wir die [str release]
vor der Rückkehr, würde die Zeichenkette zerstört werden und die Methode würde Müll zurückgeben! An dieser Stelle verwenden wir [str autorelease]
um das Objekt für die Freigabe zu einem späteren Zeitpunkt zu markieren (in der Regel, wenn die Ereignisverarbeitung abgeschlossen ist). Auf diese Weise erhält der Aufrufer sein Objekt und muss sich nicht darum kümmern, ob er es freigeben soll oder nicht.
Die Konvention ist es, autorelease für ein neues Objekt aufzurufen, bevor die Methode es an den Aufrufer zurückgibt. Ausnahmen sind Methoden mit Namen, die mit alloc
, new
o copy
. In solchen Fällen wissen die Anrufer, dass ein brandneues Objekt für sie erstellt wurde und es ihre Pflicht ist, dieses Objekt freizugeben.
Die Freigabe durch eine automatische Freigabe zu ersetzen, ist eine schlechte Idee, da sich die Objekte stapeln und den Speicher sehr schnell verstopfen würden, insbesondere in Schleifen. Die Ressourcen auf dem iPhone sind begrenzt. Um den Speicherverbrauch zu minimieren, müssen Sie das Objekt freigeben, sobald Sie es nicht mehr benötigen.