Objective-C 确定哪些对象保留另一个对象

Posted

技术标签:

【中文标题】Objective-C 确定哪些对象保留另一个对象【英文标题】:Objective-C determine what objects retain another object 【发布时间】:2010-11-06 21:49:57 【问题描述】:

我在 iPhone 上遇到了一些内存泄漏问题(想象一下),我有一个保留计数为 10 的自定义对象。

有什么方法可以知道是什么代码触发了特定对象实例的保留计数增加?如果这很重要,我正在使用 GHUnit。

【问题讨论】:

【参考方案1】:

尝试使用Build & Analyze。它通常可以告诉你一个对象是否被保留而不是被释放。/

【讨论】:

我使用它但没有任何显示,我有两个对象相互保留的情况【参考方案2】:

泄漏工具(XCode 中的“工具”之一)能够分析这类事情,但我认为您不能以编程方式进行。

这里有一个很棒的教程:http://mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/

(更新以总结 cmets):如果您想在保留方法中设置断点(查看堆栈跟踪),您可以覆盖保留方法。

【讨论】:

我正在使用泄漏工具,这就是我实际找到它的方式,我只想弄清楚如何真正跟踪特定的内存地址,并且当 -retain 选择器传递给它时,有一个断点,如果可以的话,那就太棒了.. 既然是自定义对象,我猜你可以直接覆盖 Retain? @Richard:Instruments 可以让你做到这一点。它显示了泄漏对象的完整生命周期。考虑到这一点,您可能希望快速浏览一下文档。很有用。 :-) @joshua 文档被高估了 :) jk 我现在就去看看 @Richard:同意。你应该买一本第三方的书。我碰巧知道几个月后会出现一个... ;-)【参考方案3】:

保留计数几乎没有用——如果在声明中得到retained 和autoreleased,那很好,但它的保留计数会增加1。

如果您想准确找到特定对象在 retained 的位置,请覆盖该类的 retain 实现以测试您的对象,并在此处设置断点:

@implementation MyClass
-(id) retain

    if(self == ObjectThatImTracking)
        NSLog(@"[ObjectThatImTracking retain]\n");  // put a breakpoint here
    return [super retain];

然后在调试器中运行你的程序,并在断点被命中时查看调用堆栈。

【讨论】:

直到运行时我才知道ObjectThatImTracking是什么,因为直到运行时我才知道对象的地址 这就是重点; ObjectThatImTracking 是一个全局变量。一旦您知道要跟踪的对象,然后设置变量,只要该对象被保留,retain 就会记录。【参考方案4】:

您是否尝试在模块中找到您班级的所有保留案例?也许它有帮助..

【讨论】:

以上是关于Objective-C 确定哪些对象保留另一个对象的主要内容,如果未能解决你的问题,请参考以下文章

委托和对象保留objective-c (iOS)

如何查看哪些对象保留了另一个特定对象

在objective-c中保留对象

最近创建的对象的大量保留计数。 Objective-C

Objective-C中的原子属性与线程安全

iPhone Dev Objective-C - 对象被保留,我不知道在哪里