我在整个应用程序中使用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
如何得到这些保留计数。
答案 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”仪器选项中的“记录参考计数”。看看我们能得到什么。
请参阅?许多系统框架确实使用了这个数字。现在你知道为什么它有这么大的保留计数: - )