2009-08-10 16 views
0

Angenommen, ich habe eine Variable, die bereits über eine alloc/init-Kombination zu einer Zeichenfolge initialisiert wurde. Wird es zu einem Speicherleck kommen, wenn ich es über die Verarbeitung neu zuweisen, z.Gibt es Speicherlecks beim Neuzuweisen einer Variablen?

NSString *s = [[NSString alloc] initWithString:someOtherStringVariable]; 
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Gab es hier Speicherleckage? Wenn ja, muss ich eine andere Variable erstellen (z. B. s2), diese Aufgabe ausführen und dann das Original freigeben?

Nun, was ist, wenn die andere Zeichenfolge eine Konstante ist, wie @ "Eine andere Zeichenfolge". Müsste ich mich wegen Lecks sorgen? dh.

NSString *s = [[NSString alloc] initWithString:@"Some other string"]; 
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Dank

Antwort

7

Dies ist definitiv ein Leck. Der einfachste Weg, wie diese Fragen zu kümmern ist eher früher als später zu Autorelease:

NSString *s = [[[NSString alloc] initWithString:@"Some other string"] autorelease]; 
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Sie könnten auch NSMutableString verwenden, dies auch zu tun, an Ort und Stelle (wenn dies nicht ein fiktives Beispiel ist).

+0

Danke. Das Beispiel war fiktiv, wie Sie darauf hinweisen. Ich dachte, ich hätte irgendwo gelesen, dass in jedem Fall Speicher für das String-Literal reserviert ist, also würde es niemals freigegeben werden. Also ist die Zählung der Rücklagen irrelevant. – farhadf

+3

Es ist wahr, dass Sie Zeichenfolgenliterale nicht manuell freigeben/verwalten müssen. In Ihrem Code weisen Sie jedoch kein String-Literal direkt zu, sondern [NSString Alloc] vor. Sobald Sie eine Zuweisung haben, benötigen Sie eine (automatische) Freigabe. Dies wird nicht lecken: NSString * s = @ "Einige Zeichenfolge"; s = [...]; –

+0

Bekam es. Vielen Dank. – farhadf

Verwandte Themen