[Objetive C] Speicherverwaltung vs. lokaler Variable?

Kümmelkorn

Aktives Mitglied
Thread Starter
Dabei seit
06.10.2008
Beiträge
1.941
Reaktionspunkte
127
Hallo,
ich gehe gerade das Buch "Objective C und Cocoa, Band 1: Grundlagen" von Amin Negem-Awad durch (das Buch dürfte ja recht bekannt sein).

Ich stoße da gerade bei der Speicherverwaltung auf Unstimmigkeiten, die ich nicht verstehe. An für sich habe ich die Verwaltung halbwegs verstanden, aber Amins Erklärungen zu autorelease bringen mich zum Grübeln. Amin bringt in seinem Buch folgendes Beispiel einer Methode der Klasse "Person", um den Nutzen eines autorelease zu verdeutlichen:

Code:
// Codeauschnitt auf Seite 255
-(NSString*)fullname
{
    NSMutableString* fullname;

    fullname = [[NSMutableString alloc] init];
    [fullname appendString:self.lastname];
    [fullname appendString:@", "];
    [fullname appendString:self.firstname];

    return fullname;
}
Amin im Buch schrieb:
Das NSMutableString-Objekt wird mit einem +alloc erzeugt. Demnach muss es ein -release geben, welches dies auch wieder frei gibt. Sonst haben wir ein Speicherloch. Wo sollte es aber stehen? In der Methode selbst kann es nicht stehen, da sie dann ja ein gelöschtes Objekt zurückgäbe. (...)

Macht Amin dort nicht einen Denkfehler? fullname ist hier doch - so wie ich es verstehe - eine lokale Variable, die nach "return fullname;" sowieso nicht mehr existiert, da die Funktion und damit der Gültigkeitsbereich der Variable zu Ende ist!?

Gruß, Micha
 
fullname ist ein Objekt für das er explizit speicher anfordert (alloc) und danach initialsiert (init)! Natürlich existiert das Objekt danach noch. Sonst würdest du in Obj-C keine Factories schreiben können ;)

Ja wo sollte das Release stehen? Viel Spaß beim Grübeln!
 
Macht Amin dort nicht einen Denkfehler? fullname ist hier doch - so wie ich es verstehe - eine lokale Variable, die nach "return fullname;" sowieso nicht mehr existiert, da die Funktion und damit der Gültigkeitsbereich der Variable zu Ende ist!?
Die Variable existiert danach wirklich nicht mehr. D.h. der Pointer selbst wird gelöscht, nicht aber der Speicher auf den er zeigt.
 
Stimmt, mein Denkfehler - Er benutzt ja alloc... naja, ich bin eben noch C gewohnt und mit malloc hab ich zwar auch schon gearbeitet, aber noch nicht so viel ;)

Das release müsste in diesem Fall nach jedem Aufruf von -fullname stehen, also ganz woanders - und das ist ja schlecht, das erklärt Amin ja gut in dem Buch :)
 
*fg* erinnert mich an Speicherverwaltung in C... gut, dass Objective-C da bessere Konzepte hat ^^
ObjC(vor 2.0) selbst hat im Unterschied zu C keine zusätzlichen Speicherverwaltungskonzepte. Das erledigt alles das Framework. Würdest du deine Klassen nicht von NSObject erben lassen hättest du auch kein autorelease. Du hättest nichteinmal ein alloc.

Anders ist da C++ das im Gegensatz zu C wirklich bessere Speicherverwaltungskonzepte(RAII) bietet. D.h. wenn du in C++ ein Exemplar einer Struktur(struct oder class) auf dem Stack anlegst und der Gültigkeitsbereich der Variable verlassen wird, wird tatsächlich der Destruktor der Struktur aufgerufen und nicht einfach nur die Variable gelöscht.
 
Zuletzt bearbeitet:
Zurück
Oben Unten