-6
NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];

各行の後に何がカウントを保持しますか?これを説明してください。ありがとう...

4

1 に答える 1

1

保持カウントはほとんど役に立ちません。理由の詳細については、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なく、自動解放プールがまだフラッシュされていないために実際にはまだ解放されていないためです(これは通常、イベントループで発生します)。1arrayWithObjects

2番目の結果は、保持されたオブジェクトが返され、それを再度実行している2ためです。mutableCopyretain

3番目の結果は、保持カウントが。であった1リリースをリリースしたためです。まだ自動解放プールをフラッシュしていません。arr2

4番目の結果は、保持カウントがの1リリースしたためです。newArr2

最終的な結果は、変数1の内容をリークしnewArr、新しい自動解放された配列を割り当てたためです。の保持カウント1は、まだ自動リリースされていないカウントです。

ただし、保持カウントは信頼されるべきではありません。メモリ管理ルールを学びます(ARCを使用しているかどうかに関係なく)。

于 2013-01-24T07:55:35.450 に答える