2

Xcode 4.4.1で空のiOSアプリを作成し、次のことを行いました。

NSNumber *n1 = @1;
NSNumber *n2 = @2;
NSNumber *n3 = @3;
NSNumber *n100 = @100;

NSString *s = @"haha";
NSArray *a = @[n1, s];
NSDictionary *d = @{ @"ha" : @1, @3 : @"hello" };

NSLog(@"retain count of @1 is %i", [n1 retainCount]);
NSLog(@"retain count of @2 is %i", [n2 retainCount]);
NSLog(@"retain count of @3 is %i", [n3 retainCount]);
NSLog(@"retain count of @100 is %i", [n100 retainCount]);

NSLog(@"retain count of @\"haha\" is %i", [s retainCount]);

NSLog(@"retain count of array literal is %i", [a retainCount]);
NSLog(@"retain count of dictionary literal is %i", [d retainCount]);

結果は次のとおりです。

retain count of @1 is 10
retain count of @2 is 4
retain count of @3 is 5
retain count of @100 is 1
retain count of @"haha" is -1
retain count of array literal is 1
retain count of dictionary literal is 1

したがって、配列リテラルと辞書リテラルの保持数は1であり、文字列リテラルはアプリ全体の実行中に存在すると言われているため、-1(おそらくMAX unsigned intを意味します)ですが、@1実際の保持数は次のようになります。異なる時間に7、8、および10。それにルールはありますか?私もできることがわかりました。それ[n1 retain][n1 release]応じて、保持数が増減します。

4

2 に答える 2

4

知らない。

StackOverflowの誰も正確にそうしません。

なんで?

それを知っているのはAppleのエンジニアだけだからです。基盤はそのインターフェースにおいてのみ単純です-基礎となる実装は混乱です。これはObjective-Cランタイムと混ざり合っており、多くの可能性のある、またはありそうな状況に合わせてハードに最適化されています。ドキュメントで信頼できないものとして言及されている場合は、真剣に受け止めてください。

- retainCountそれらの1つです。クラスの特定のインスタンスの実際の参照カウントを取得することはできません。その絶対値は無意味です。この方法の場合、相対的な変化のみが意味を持ちます。自動解放プールと自動参照カウント(ここでは適用されません)を使用すると、別のレベルのあいまいさが追加されます。

それが理由です。

ああ、そうです、http://whentouseretaincount.comをチェックして ください

于 2012-09-14T04:50:00.117 に答える
0

これは理由を示していると思います。@1遭遇するたびに、のようなもの[[[NSNumber alloc] initWithInt:1] autorelease]であり、同じオブジェクトを返すように見えます。したがって、次のことが行われると:

NSMutableArray *arr = [[NSMutableArray alloc] init];
for (int i = 0; i < 300; i++) {
    [arr addObject:@1];
}

保持カウントは実際には610になります。次の場合も同じです。

NSMutableArray *arr = [[NSMutableArray alloc] init];
for (int i = 0; i < 300; i++) {
    [arr addObject:[[[NSNumber alloc] initWithInt:1] autorelease]];
} 

更新:の使用により保持カウントが1増加するため、610になります@1。また、配列によって保持される場合は、合計600倍になります)。これは@1、whereを使用すると保持カウントが増加することを示しており、このNSNumberオブジェクトはおそらく同じ回数だけ自動解放プールに配置されます。

于 2012-09-14T05:42:26.563 に答える