1

次のコードがあるとしたら、メモリ管理のポイントが100%明確ではありません。

{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}

これにより、最初の割り当てのメモリリークが発生しますか?そうでない場合はどうしてですか?

4

3 に答える 3

2

ARCでは、これはメモリをリークしません。これは、強力なオブジェクトポインタが変更されるたびに、コンパイラが自動的releaseに古いオブジェクトにを送信するためです。のようなローカル変数は、NSString *stringデフォルトで強力です。

したがって、上記のコードは次のようにコンパイルされます。

{
NSString *string = [[NSString alloc] init];

// Oh, we're changing what `string` points to. Gotta release the old value.
[string release];
string = [[NSString alloc] init];
}
于 2012-07-25T14:53:22.213 に答える
1

概念的には、BJは正しいですが、生成されるコードは少し異なります。これは次のようになります。

NSString *string = [[NSString alloc] init];

// Oh, we're changing what `string` points to. Gotta release the old value.
NSString *tmpString = string;
string = [[NSString alloc] init];
[tmpString release];
[string release]; // string goes out of scope at this point in your code

この操作の順序は通常それほど重要ではありません(そして、それを気にしすぎると、おそらく正しくコーディングしていません)。しかし、それを理解することで、オブジェクトが正確に破壊される理由が説明されます。

于 2012-07-25T15:21:03.397 に答える
1

いいえ、リークは発生しません。ARCは、2番目の文字列を設定する前に、最初の文字列を解放します。これは本当に驚くべきARCの力です!

于 2012-07-25T14:53:20.990 に答える