2009-08-10 4 views
0

alloc/initの組み合わせですでに文字列に初期化されている変数があるとします。処理を介して再割り当てするとメモリリークが発生しますか?変数の再割り当て時にメモリリークがありますか?

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

ここにメモリリークがありますか?その場合は、別の変数(例:s2)を作成してこの割り当てを行い、元の変数を解放する必要がありますか?

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

ここで、他の文字列が@ "Some other string"のような定数の場合はどうなりますか?漏れを心配する必要はありますか?すなわち、これは間違いなくリークである

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

おかげ

答えて

7

。このような問題の世話をする最も簡単な方法は、すぐにではなく、後に自動解放することです:

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

(これは、概念的な例ではない場合)、また所定の位置に、同様にこれを行うにはNSMutableStringを使用することができます。

+0

ありがとうございました。この例は、あなたが指摘しているように名目上のものでした。私はどこかで文字列リテラルに割り当てられたメモリがあると読んだと思ったので、決して解放されませんでした。だから、保持カウントは無関係だった。 – farhadf

+3

文字列リテラルを解放/手動でメモリ管理する必要はありません。しかし、あなたのコードでは文字列リテラルを直接代入するのではなく、[NSString alloc]を前に代入します。 allocがあるとすぐに(自動)リリースが必要です。これはリークしません:NSString * s = @ "Some string"; s = [...]; –

+0

入手しました。ありがとう。 – farhadf

関連する問題