2011-01-24 15 views
2

私は、次の(その自動解放など)手動解除を必要としないことを知っている:iOSメモリ管理:文字列を解放するかどうか?

NSString* str1 = [NSString string]; 

そして、これは手動解除が必要になります。

この程度
NSString* str2 = [[NSString alloc] init]; 
[string2 release]; 

しかし、どのように?オートレリースされているかどうか?

NSString* str3 = @"Example string"; 

そして最後に、以下のスニペットを見て:私は、RootViewControllerの参照を解放し、正しくiOSのメモリ管理を理解している場合、それは使用可能な他のそれどこのコードではないだろうように、「RVC」オブジェクトをクリアします私はそれを望んでいません。しかし、少なくとも、nullへの参照を設定する必要がありますか?または、私は長期間にメモリリークを引き起こすことなく、コードにtheaseの参照を残すことができますか?

- (void)myMethod 
{ 
RootViewController *rvc = (RootViewController *)navigationController.topViewController; 
// using rvc somehow... 
// ...but should I set it to null? 
} 

答えて

6

文字列リテラルを解放する必要はありません。自動リリースされませんが、その行には作成されません。文字列リテラルは特別なケースです(Objective-Cの唯一のリテラルオブジェクトです)、それらを解放しようとする試みは無視されます。

rvcはローカル変数なので、MyMethodが終了するとすぐにアクセスできなくなります。何にも設定する必要はありません(ヌルではなく、無限になります)。あなたが持っている割り当ては、topViewControllerのアドレスを取得してローカル変数に格納する以外は何もしません。したがって、メモリ管理の効果はありません。

1

@"Example string"は、コンパイル時定数です。メモリはコンパイラによって割り当てられます。だから、ライン

NSString *str3 = @"Example string"; 

であなただけの定数に代入していて、言葉「保持」、「のAlloc」、「新規」、「コピー」のいずれかを使用する場合は、str3

5

を解放するべきではありません(RANC)を使用すると、オブジェクトの所有者であり、メモリ管理を担当します。あなたはRANCの言葉を使わなかったので、あなたは解放する必要はありません。詳細については、http://www.mobiledev.nl/memory-management-in-ios/を参照してください。

関連する問題