次のコードがあるとしたら、メモリ管理のポイントが100%明確ではありません。
{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}
これにより、最初の割り当てのメモリリークが発生しますか?そうでない場合はどうしてですか?
次のコードがあるとしたら、メモリ管理のポイントが100%明確ではありません。
{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}
これにより、最初の割り当てのメモリリークが発生しますか?そうでない場合はどうしてですか?
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];
}
概念的には、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
この操作の順序は通常それほど重要ではありません(そして、それを気にしすぎると、おそらく正しくコーディングしていません)。しかし、それを理解することで、オブジェクトが正確に破壊される理由が説明されます。
いいえ、リークは発生しません。ARCは、2番目の文字列を設定する前に、最初の文字列を解放します。これは本当に驚くべきARCの力です!