2009-08-09 12 views
4

Ok, ich weiß, die Antwort auf diese Frage sollte offensichtlich sein, aber ich brauche einen kleinen Stoß in die richtige Richtung.Freigabe von Objekten zurückgegeben von Methode

finde ich mich eine ganze Reihe von Methoden zu schreiben, das folgende Muster folgen:

-(NSThing*)myMethod{ 

    NSThing *thing = [[NSthing alloc] init]; 
    // do some stuff with the thing 
    return thing; 
} 

Meine Frage ist, wie gehe ich mit der Veröffentlichung dieses Objekt? Natürlich kann ich es nicht innerhalb der Methode veröffentlichen.

Antwort

13

in der Regel würden Sie es

-(NSThing*)myMethod{ 

    NSThing *thing = [[NSthing alloc] init]; 
    // do some stuff with the thing 
    return [thing autorelease]; 
} 
+0

Hallo, kann ich tun {NSThing * thing = [[[[NSding Alloc] init] Autorelease]; Rückkehr Sache;} hier? – onlinenaman

+1

@onlinenaman: yes – newacct

5

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!):

+0

Technisch sollte es eine beliebige Methode sein, die mit "alloc" oder "new" beginnt oder "copy" enthält, nicht "init", obwohl unit zwangsläufig von init gefolgt wird, aber nicht alle inits folgen alloc. Weitere Informationen finden Sie unter

+0

. Wenn Sie < and > um Links herum platzieren, wird am Ende der URL ein zusätzliches Escapezeichen angezeigt. Hier ist die gleiche URL ohne spitze Klammern: http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html –

+0

'+ StringWithString:' wird in der Regel reduziert, wenn der Parameter eine literale Zeichenfolge ist, aber Dasselbe kann nicht für '+ stringWithFormat:' getan werden - diese Methode liefert garantiert eine eindeutige NSString-Instanz. –

Verwandte Themen