如何找到引用Objective-C对象的位置?

时间:2012-12-20 23:19:23

标签: objective-c xcode

我正在使用Xcode中的Allocations工具来跟踪正在创建但未发布的对象。我可以看到代码执行时对象数量增加,我可以看到使用调用堆栈创建对象的位置,但我无法分辨对象引用的位置。我认为他们被关押在第三方库中,但开发人员说“不,它必须是你的代码”。我将我的代码中的引用设置为nil,但对象仍然存在。

2 个答案:

答案 0 :(得分:1)

我认为不存在一种工具可以告诉您每个引用在任何时间点的位置。在您使用ARC时,根据我的经验,有两种相当常见的方法可以让您自己陷入参考周期和泄漏内存:

  1. A类强烈引用B类实例,它强烈引用了A类的同一个实例。
  2. Blocks隐式保留对其捕获的对象的引用。所以一个显而易见的问题是当你的对象保留一个保留对self的引用的块时。
  3. 示例:

    self.retainedBlock = ^{
        [self doSomething];
    };
    

    <强>修正:

    __weak id weakSelf = self;
    self.retainedBlock = ^{
        id strongSelf = weakSelf;
        [strongSelf doSomething];
    };
    

答案 1 :(得分:-1)

这是一种绝望的策略,但你能做的是:

  1. 为受影响的对象禁用ARC(或解决它;请参见下文);
  2. 添加记录retainautoreleaserelease;
  3. 通过日志跟踪已知的过度保留对象。
  4. 最简单的例子:

    - (void)release
    {
        NSLog(@"%@ : %@", self, [NSThread callStackSymbols]);
        [super release];
    }
    

    (但是,实际上,在由[NSThread callStackSymbols]索引的字典中为内存管理调用保留[NSValue valueWithPointer:self]数组可能会更加智能,然后访问来自lldb或将其写入磁盘;为什么要手动有效地索引数据呢?)

    解决ARC的最简单方法可能是编写一个禁用ARC的单个类,该方法可以将日志记忆管理方法调整到您想要跟踪的对象上。