2009-05-10 12 views
0

.NETの背景から来ていますが、ストレージ用の文字列変数を再利用するのに使用しています。そのため、以下のコードでメモリリークが発生する可能性がありますか?コードはiphone/itouchを対象としているので、自動GCはありません。NSString変数の再利用 - メモリリークの原因になりますか?

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

    return result; 
} 

NSStringは不変ですが、問題なく「不変」変数を再利用できます。

答えて

13

間違いなくになり、メモリリークが発生します。あなたは安全であるかどうかを判断する基礎となるNSStringオブジェクトの実際の実装についてたくさん知っておく必要があるので、再利用することに注意する必要があります。したがって、ガベージコレクションを使用していない場合は、安全のために、変数を再利用するべきではありません。

は例えば、これは完全に安全である:

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

初期文字列は、実際にObjective-Cの文字列定数だったので。これは、しかし、メモリリークにつながる:あなたが最初の場所で結果を所有したことがないので、

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

これは、しかし、安全で次のようになります。

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

だから、基本的に、あなたがいない場合オブジェクトを所有しているか、ガベージコレクションを有効にしていると、安全です。しかし、オリジナルのオブジェクトを所有していて、これを行うと、メモリがリークします。

2

はジェイソンの答えにで鳴る:あなたはretaininitcopymutableCopyを呼び出すかinitWithSomethingのいずれかの方法を使用しない場合は、ない独自のオブジェクトを行います。

あなたのコードでは、@"example"はコンパイルされたコードに格納されているため、リリースするものはありません。そして、あなたがstringWithStringを返すので、あなたはそのオブジェクトを所有しておらず、将来、ある時点でそれがオートリリースされると想定することができます。

0

"間違いなくメモリリークが発生する可能性があります。安全であるかどうかを判断するために、NSStringオブジェクトの実際の実装について多くのことを知っておく必要があります。あなたがガベージコレクションを使用していない場合は、安全のために、あなたが持っている方法で変数を再利用すべきではありません。

しかし、.Netのユーザーはメモリリークの原因となる不正なステートメントを使用したことはありません。上記のステートメントは正当なものであり、@ "example test"という文字列を返します。

関連する問題