为什么保留@ 1的计数等于7,8或10?(Why is the retain count of @1

2019-09-22 10:27发布

我创建了的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无符号整数),但保留计数的@1真正到来出为7,图8和10在不同的时间。 是否有它的规则? 我发现我可以做[n1 retain][n1 release]还有,它会增加,相应减少了保留计数。

Answer 1:

我不知道。

无论是否有人在计算器上完全相同。

为什么?

因为这只是苹果公司的工程师,谁知道它。 基金会仅在其界面简单-底层实现是一个烂摊子 。 它的混合与Objective-C的运行时,进行了大量的可能或很可能的情况下优化辛苦了,如果事情是在文档提到,是不是可以倚靠一件事,那就是要认真对待。

- retainCount就是其中之一。 这不是那里得到一个类的实例particual的实际引用计数 - 其绝对值是没有意义的。 只有相对变化是这种方法的情况下才有意义。 使用自动释放池和自动引用计数(虽然这里不适用)的增加不确定性的另一个层次。

这就是为什么。

哦,是的, 你看看 http://whentouseretaincount.com



Answer 2:

我想这点为何原因:每次@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]];
} 

更新:它是610,这是因为保持计数加1通过的使用@1 ,并且当其由阵列保留,所以它是总的600倍的另一时间)。 这表明,任何使用@1的任何地方将增加保留计数,这NSNumber的对象可能是放置在自动释放池的时间相同数量相等。



文章来源: Why is the retain count of @1 equal to 7, 8 or 10?