2009-05-10 6 views
0

Kommend von einem .NET Hintergrund verwende ich, um String-Variablen für den Speicher wiederverwenden, ist also der Code unten wahrscheinlich zu einem Speicherverlust führen? Der Code zielt auf das iPhone/iTouch, also keine automatische GC.Wiederverwenden einer NSString-Variable - führt es zu einem Speicherverlust?

-(NSString*) stringExample 
{ 
    NSString *result = @"example"; 
    result = [result stringByAppendingString:@" test"]; // where does "example" go? 

    return result; 
} 

Was mich verwirrt ist NSStrings unveränderlich sind, aber man kann ohne Probleme eine ‚unveränderliche‘ Variable wiederverwenden.

Antwort

13

Es kann definitiv kann führen zu Speicherlecks. Sie müssen bei der Wiederverwendung vorsichtig sein, da Sie viel über die tatsächliche Implementierung des zugrundeliegenden NSString-Objekts wissen müssen, um zu entscheiden, ob Sie "sicher" sind oder nicht. Wenn Sie also keine Garbage-Collection verwenden, sollten Sie die Variablen nicht wie gewohnt wiederverwenden.

Zum Beispiel ist dies absolut sicher:

NSString *result = @"example"; 
result = [result stringByAppendingString:@" test"]; 

, weil die anfängliche Zeichenfolge tatsächlich ein Objective-C-String konstant war. Dies würde jedoch zu einem Speicherverlust:

NSString *result = [[NSString alloc] initWithUTF8String:argv[0]]; 
result = [result stringByAppendingString:@" something more"]; 

Das aber wäre sicher, da Sie nie Ergebnis in erster Linie im Besitz:

NSString *result = [NSString stringWithUTF8String:argv[0]]; 
result = [result stringByAppendingString:@" something more"]; 

Also im Grunde, wenn Sie nicht tun besitze das Objekt oder du hast die Müllsammlung eingeschaltet, es ist sicher. Wenn Sie jedoch das Originalobjekt besitzen und dies tun, werden Sie Speicher verlieren.

2

auf Jasons Antwort Chiming in: Wenn Sie nicht retain rufen Sie, init, copy, mutableCopy oder einer der initWithSomething Methoden verwenden, die Sie nicht eigenen das Objekt.

Also in Ihrem Code, @"example" ist eine Zeichenfolge-Konstante im kompilierten Code gespeichert, so gibt es nichts zu veröffentlichen. Und da Sie eine stringWithString zurückgeben, besitzen Sie das Objekt nicht und können davon ausgehen, dass es irgendwann in der Zukunft automatisch freigegeben wird.

0

"Es kann definitiv Speicherlecks führen. Sie müssen vorsichtig sein bei der Wiederverwendung, dass Sie eine Menge über die tatsächliche Implementierung des zugrunde liegenden NSString-Objekts wissen müssen, um zu entscheiden, ob Sie" sicher "sind oder nicht Wenn Sie keine Speicherbereinigung verwenden, sollten Sie die Variablen nicht so verwenden, wie Sie es gewohnt sind. "

Aber der .Net Kerl nie illegale Aussagen verwendet, die Speicherlecks verursachen! Die obigen Aussagen sind definitiv legal und geben den String @ "Beispiel Test" zurück.

Verwandte Themen