不规则地保留NSNumber的数量

时间:2014-04-26 07:56:45

标签: ios objective-c nsnumber retaincount

我在整个应用程序中使用NSNumber(非ARC)使用不同的语法。为了更加了解情况,我试着看看NSNumber是如何保留的,具体取决于它们的初始化语法。所以我做了以下事情:

NSNumber* a = @1;
NSNumber* b = [[NSNumber alloc] initWithInt:2];
NSNumber* c = [NSNumber numberWithInt:3];

NSLog(@"%d | %d | %d", a.retainCount, b.retainCount, c.retainCount);

这个代码片段是通过按钮点击执行的,输出让我感到困惑(重复点击):

73 | 27 | 6
78 | 159 | 22
78 | 160 | 22
78 | 161 | 22
78 | 162 | 22
78 | 163 | 22
85 | 169 | 22
85 | 170 | 22
85 | 171 | 22
85 | 172 | 22

现在这并没有真正的目的(至少在我的情况下不是这样),但我想知道这些NSNumber如何得到这些保留计数。

2 个答案:

答案 0 :(得分:6)

你永远不应该使用retainCount。决不。 look here

答案 1 :(得分:2)

在Objective-C中,retainCount是控制对象生命周期的数字。对象保持活动状态,直到retainCount变为0,然后对象被取消分配。这是大局,除了很多例外,但这是适用于此的规则。

这些保留计数表示这些数字在您的应用程序中的某处使用。其他一些对象保留了它们。由于您自己的代码没有,这意味着其他一些系统对象会这样做。

我们将使用“分配”工具对您的应用进行分析,并了解它可以告诉我们什么。这是我们将运行的代码:

NSNumber* a = @1;
NSNumber* b = [[[NSNumber alloc] initWithInt:2] autorelease];
NSNumber* c = [NSNumber numberWithInt:3];

NSLog(@"%d | %d | %d", a.retainCount, b.retainCount, c.retainCount);

[[[UIAlertView alloc] initWithTitle:@"number b"
                            message:[NSString stringWithFormat:@"address: %p, retainCount: %d", b, b.retainCount] delegate:nil
                  cancelButtonTitle:nil
                  otherButtonTitles:nil] show];

此警报会告诉我们该号码的地址是什么。仪器将让我们跟踪这个物体的生命。

让我们在我们的方案的配置文件设置中选择Debug配置。让我们检查“Allocations”仪器选项中的“记录参考计数”。看看我们能得到什么。

enter image description here

enter image description here

请参阅?许多系统框架确实使用了这个数字。现在你知道为什么它有这么大的保留计数: - )