Cocoa umgeht die Einschränkungen von AddRef
/Release
in COM, indem es ein drittes Geschwisterchen einführt: autorelease
.
retain
- Ich brauche das, lass es bestehen.
release
- Ich brauche das nicht mehr, du kannst es sofort entfernen.
autorelease
- Ich brauche das nicht, lass es jedoch noch ein paar Sekunden stehen, falls es jemand anderes zuerst abholen möchte.
Durch diese kleine Ergänzung können die meisten Rückgabewerte behandelt werden, als ob wir eine Garbage Collection hätten. Wenn du daran interessiert bist, den Rückgabewert zu behalten, musst du nichts zusätzlich tun.
Um dies zum Funktionieren zu bringen, gibt es eine Konvention (eine Konvention, die gut genug ist, um den Compiler das Speichermanagement automatisch für dich mit der kommenden ARC machen zu lassen):
- Methoden, die mit diesen müssen zurückgegebene Instanzen beibehalten:
- All andere müssen instanzen mit Autorelease zurückgeben.
Drei Beispelimplementierungen zeigen, wie dies in der Praxis angewendet werden kann:
-(NSString*)newHelloWorldString {
NSString* s = [NSString stringWithString:@"Hello world"];
// Apply retain because s in now autoreleased
return [s retain];
}
-(NSString*)helloWorldString {
NSString* s = [[NSString alloc] initWithString:@"Hello world"];
// Apply autorelease because s is now retained.
return [s autorelease];
}
-(NSString*)fullName {
// No memory management needed, everything is autoreleased and good.
NSString* fn = [self firstName];
NSString* ln = [self lastName];
NSString* s = [NSString stringWithFormat:@"%@ %@", fn, ln];
return s;
}