0

.NET のバックグラウンドから来て、ストレージに文字列変数を再利用することに慣れているので、以下のコードはメモリ リークを引き起こす可能性がありますか? コードは iphone/itouch をターゲットにしているため、自動 GC はありません。

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

    return result;
}

私を混乱させるのは、NSStringsが不変であることですが、「不変」変数を問題なく再利用できます。

4

3 に答える 3

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"];

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

于 2009-05-10T13:55:29.347 に答える
2

ジェイソンの答えに耳を傾ける: retaininitcopymutableCopyまたはいずれかのinitWithSomethingメソッドを使用しない場合、オブジェクトを所有していません。

したがって、コードで@"example"は、コンパイルされたコードに格納されている文字列定数であるため、解放するものはありません。また、stringWithStringオブジェクトを所有していないため、将来のある時点で自動解放されると想定できます。

于 2009-05-10T14:37:22.927 に答える
0

「間違いなくメモリリークが発生する可能性があります。「安全」かどうかを判断するには、基盤となるNSStringオブジェクトの実際の実装について多くのことを知っている必要があるため、再利用には注意が必要です。ガベージコレクションを使用しないでください。安全のために、変数を現在のように再利用しないでください。」

しかし、.Netの人は、メモリリークの原因となる違法なステートメントを使用したことはありません。上記のステートメントは間違いなく合法であり、文字列@"exampletest"を返します。

于 2010-03-09T05:02:07.553 に答える