【发布时间】:2010-11-06 21:49:57
【问题描述】:
我在 iPhone 上遇到了一些内存泄漏问题(想象一下),我有一个保留计数为 10 的自定义对象。
有什么方法可以知道是什么代码触发了特定对象实例的保留计数增加?如果这很重要,我正在使用 GHUnit。
【问题讨论】:
标签: iphone objective-c memory-leaks retaincount
我在 iPhone 上遇到了一些内存泄漏问题(想象一下),我有一个保留计数为 10 的自定义对象。
有什么方法可以知道是什么代码触发了特定对象实例的保留计数增加?如果这很重要,我正在使用 GHUnit。
【问题讨论】:
标签: iphone objective-c memory-leaks retaincount
尝试使用Build & Analyze。它通常可以告诉你一个对象是否被保留而不是被释放。/
【讨论】:
泄漏工具(XCode 中的“工具”之一)能够分析这类事情,但我认为您不能以编程方式进行。
这里有一个很棒的教程:http://mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/
(更新以总结 cmets):如果您想在保留方法中设置断点(查看堆栈跟踪),您可以覆盖保留方法。
【讨论】:
保留计数几乎没有用——如果在声明中得到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 就会记录。
您是否尝试在模块中找到您班级的所有保留案例?也许它有帮助..
【讨论】: