如何查找对象的引用计数

时间:2011-09-20 20:01:58

标签: iphone objective-c xcode

我想知道程序中对象的引用计数。我可以吗?

6 个答案:

答案 0 :(得分:6)

不确定

int referenceCount = rand();

当然,真正的答案是retainCount方法; NSUInteger rC = [someObject retainCount];。但是,它返回的值是无用的。

  • 从不从不在条件

    中使用保留计数
  • 保留计数从不为零

  • 保留计数从不反映对象是否已自动释放

  • 有些班级的保留计数为2亿英镑是完全合理的

  • 通过系统API的任何对象的保留计数可能是表示问题的看似随机的值

底线:如果您将保留计数视为绝对值,那么您做错了。您可以通过代码增加减少保留计数,保持你的优点和缺点,并且你做得对。

答案 1 :(得分:2)

你可以,但你错了:你不想这样做。

答案 2 :(得分:1)

这不是意味着......

[obj retainCount];

答案 3 :(得分:1)

永远不要使用retainCount,它不会像你想象的那样工作。

请参阅:SO on finding retains/releases

答案 4 :(得分:1)

正如大家所说,你可以,但不要使用它。

当我开始时我也认为使用引用计数我可以更容易地发现我的记忆问题。我浪费了太多时间。你得到的数字是错误的,因为你不能(轻松地)使用它来查找你的内存管理问题。

使用alloc,new和手动保留来真正检查所有手动创建的对象要好得多。

简单地坐下来专注于“谁拥有这个变量的所有权?”这个问题。所有的人都会让你的变种活着。另外一定要使用self.ivar设置你的ivars,否则不会设置对象的所有权。

但最简单的是在最新版本中使用ARC。这照顾了(大多数)所有这些问题......

答案 5 :(得分:1)

不确定为什么所有关于不使用retainCount的帖子,它在跟踪内存问题方面很有价值,现在我不会将它作为条件使用,甚至不理解如何使用它,但你可以添加一个简单的类别,并充分利用保留计数来确定任何给定类的生命周期使用情况。

@implementation replaceWithYourClassName (MemoryInspecting)

- (id) retain
{
    NSLog(@"RETAIN: self [%@] : retain count [%d]", [self description], [self retainCount]);
    return [super retain];
}

- (void) release
{
    NSLog(@"RELEASE: self [%@] : retain count [%d]", [self description], [self retainCount]);
    [super release];
}

并在那里抛出一些断点,以跟踪上下文,如果这有助于,通常会这样做。