NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];
各行の後に何がカウントを保持しますか?これを説明してください。ありがとう...
NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];
各行の後に何がカウントを保持しますか?これを説明してください。ありがとう...
保持カウントはほとんど役に立ちません。理由の詳細については、http://whentouseretaincounts.comを参照してください。
ただし、コードに呼び出しを追加retainCount
し、次のコマンドを実行しました。
NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSLog(@"%ld", [arr retainCount]);
NSArray *newArr = [[arr mutableCopy] retain];
NSLog(@"%ld", [newArr retainCount]);
[arr release];
NSLog(@"%ld", [arr retainCount]);
[newArr release];
NSLog(@"%ld", [newArr retainCount]);
newArr = [NSArray arrayWithObject:@"sdfdhs"];
NSLog(@"%ld", [newArr retainCount]);
次の結果が得られました。
2013-01-24 15:45:56.840 Untitled 2[96774:707] 2
2013-01-24 15:45:56.842 Untitled 2[96774:707] 2
2013-01-24 15:45:56.842 Untitled 2[96774:707] 1
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1
最初の結果は、からの戻り値が自動解放されたためでは2
なく、自動解放プールがまだフラッシュされていないために実際にはまだ解放されていないためです(これは通常、イベントループで発生します)。1
arrayWithObjects
2番目の結果は、保持されたオブジェクトが返され、それを再度実行している2
ためです。mutableCopy
retain
3番目の結果は、保持カウントが。であった1
リリースをリリースしたためです。まだ自動解放プールをフラッシュしていません。arr
2
4番目の結果は、保持カウントがの1
リリースしたためです。newArr
2
最終的な結果は、変数1
の内容をリークしnewArr
、新しい自動解放された配列を割り当てたためです。の保持カウント1
は、まだ自動リリースされていないカウントです。
ただし、保持カウントは信頼されるべきではありません。メモリ管理ルールを学びます(ARCを使用しているかどうかに関係なく)。