【问题标题】:Irregular retain counts of NSNumbersNSNumbers 的不规则保留计数
【发布时间】:2014-04-26 07:56:45
【问题描述】:

我在整个应用程序(非 ARC)中使用不同的语法使用 NSNumbers。为了了解更多信息,我尝试查看 NSNumbers 如何根据它们的初始化语法保留。所以我做了以下事情:

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

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

【问题讨论】:

标签: ios objective-c nsnumber retaincount


【解决方案1】:

你不应该使用retainCount。绝不。 look here

【讨论】:

  • 在输出中打印出来并不危险。当然while (0 != obj.retainCount) [obj release] 是完全错误的。
  • 你不能打印retainCount,因为它不会给你任何无用的信息。你是在告诉我你比那些编写框架的人更了解它吗?他们说永远不会。
  • 是的。这是货物崇拜编程。没有理解和简单地应用权威论点。事实上,内存是由保留计数管理的。为了控制内存管理,必须了解保留计数。保留计数不是禁忌,也不是禁止的。人们必须对保留计数感到满意。他们试验是正常的。
  • @GwendalRoué 不,真的,不要使用retainCount。除了最人为的情况外,返回的值在所有情况下都是没有意义的。它不是一个有用的调试工具。 Instruments 中的计数非常有用,只是因为 Instruments 还显示了每个保留、释放和其中的线程的回溯。如果没有这些附加信息,绝对保留计数是没有意义的。
  • @Cy-4AH 保留计数无法告诉您对象是否被释放;例如,retainCount 方法永远不能返回 0。它也不反映对象的自动释放状态。
【解决方案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];

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

让我们在方案的配置文件设置中选择调试配置。让我们检查“分配”工具选项中的“记录引用计数”。看看我们能得到什么。

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

【讨论】:

  • 请注意,行为会因系统和平台而异。具体来说,哪些数字被实现为单例是一个实现脱轨。
  • 但这回答了这个问题:“我想知道这些 NSNumbers 是如何获得这些保留计数的。”
  • 由于“不要考虑保留计数”政策,也没有投票。尽管诚实地回答了一个诚实的问题。
  • 部分; StackOverflow 的重点是教育。鉴于与使用 retainCount 相关的所有问题,没有警告提问者其中危险的答案是不完整的。然而,关于使用分配工具来跟踪这些事件的详细建议肯定不止于此。
  • @bbum 我很确定“实施脱轨”是一种自动更正,但我从现在开始使用它来描述因违反抽象而导致的错误。
猜你喜欢
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2020-11-03
相关资源
最近更新 更多