NSStringの変数を再利用 - それはメモリリークが発生しますか?
-
21-08-2019 - |
質問
私は、ストレージのための文字列変数を再利用するために使用していた.NET背景から来るので、メモリリークが発生する可能性が高い以下のコードはありますか?コードは、iPhone / iTouchのように自動的なGCを標的とされていない。
-(NSString*) stringExample
{
NSString *result = @"example";
result = [result stringByAppendingString:@" test"]; // where does "example" go?
return result;
}
どのような私を混乱することはNSStringsは不変ですされていますが、問題なく「不変」変数を再利用することができます。
解決
これは間違いなくのメモリリークが発生することができますを。あなたは、あなたが「安全」だかどうかを決定するために基本となるの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"];
あなたがオブジェクトを所有していないか、ガベージコレクションがオンになっている場合は、だから、基本的には、それが安全です。ただし、元のオブジェクトを所有し、あなたがこれを行う場合は、メモリをリークされます。
他のヒント
ジェイソンの答えにで鳴る:あなたはretain
、init
、copy
、mutableCopy
を呼び出すか、initWithSomething
の方法のいずれかを使用しない場合、ないの自分ののオブジェクト
あなたのコードでは、@"example"
を解放するものは何もありませんので、コンパイルされたコードに格納されている文字列定数であるので。そして、あなたはあなたがオブジェクトを所有していないし、それが将来のある時点で自動解放されると仮定することができますstringWithString
を戻ってきているからです。
「それは間違いなく、メモリリークが発生することができます。あなたは、あなたがしているかどうかを判断するための基礎となるのNSStringオブジェクトの実際の実装について多くを知っている必要があることで再利用するには注意する必要が 『そう。安全』かあなたは安全のために、ガベージコレクションを使用していない場合は、変数にあなたが持っている方法を再利用してはならない。」
しかし、ネットの男は、メモリリークが発生します違法なステートメントを使用したことがありません!上記の文は間違いなく、法的で、「サンプルテスト」@文字列を返します。