Autoreleasing ist der einfache Weg, um aus dieser Autorelease, wie newacct sagte. Sie sollten jedoch die "Eigentumsrechte" des zurückgegebenen Objekts berücksichtigen.
In Objective-C, ist die Faustregel, dass jede Methode mit alloc
, new
oder copy
in seinem Namen ein Objekt zurückgibt, die nicht autoreleased wird, während andere Methoden (wie Klassenmethoden) pre-Autofreigabe des Objekt zurück. So sind diese drei nicht gleichwertig in Bezug auf die Autorelease (obwohl der Compiler etwas Magie tun kann und reduzieren sie alle String-Konstanten sowieso):
// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];
// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];
Ihr Code kann einen ähnlichen Ansatz, wo Sie überlegen, wer das Objekt besitzt Du kommst zurück. In dem konkreten Beispiel, das Sie angegeben haben, ist die Methode die Methode alloc
ing und init
das Objekt zu bearbeiten, also sind Sie in der Regel für die autorelease
in Ihrer eigenen Methode verantwortlich. Wenn Sie jedoch eine Methode schreiben, die ein bereits existierendes Objekt annimmt und es in irgendeiner Weise modifiziert, würden Sie dieses Objekt nicht besitzen und nicht für die automatische Freigabe des zurückgegebenen Objekts verantwortlich sein. (Andernfalls kann es tatsächlich dazu führen, Probleme auf dem Weg, wenn der Autofreigabepool, zu dem das Objekt gehört abgelassen wird.)
Siehe auch (dank Peter und Quinn in den Kommentaren!):
Hallo, kann ich tun {NSThing * thing = [[[[NSding Alloc] init] Autorelease]; Rückkehr Sache;} hier? – onlinenaman
@onlinenaman: yes – newacct