在没有仪器的情况下在ARC中调试循环保留

在没有仪器的情况下在ARC中调试循环保留

问题描述:

在ARC之前的时代,我可以覆盖保留和释放并记录堆栈跟踪 - 然后轻松找到保留我的对象的位置,而不应该。在没有仪器的情况下在ARC中调试循环保留

现在禁止这样做,有时运行的仪器不是一个选项(例如,只要我尝试在设备上运行我的应用程序,并且该错误不会在模拟器中重现,它就会崩溃)。

任何建议如何在没有乐器的情况下在ARC中完成此操作?

我可能没有最终答案,但我会分享一个技巧,我决定尝试哪一步是正确的方向。

使用ARC时,编译器不会允许您询问retainCount,它甚至足以让您停止执行performSelector:@selector(retainCount)。然而,我并没有放弃,而是更进一步去获得这个有用的调试指标。

[anInstance performSelector:NSSelectorFromString(@"retainCount")]; 

这样就会越过编译器,并且会在后台显示更多内容。这不是堆栈,但是通过大量记录这个值,你可以得到一些提示。

我可能会放弃它,但我正在玩一个更棘手的技术(阅读:丑陋)来获取堆栈。基本思想是通过class_addMethod()或method_setImplementation通过objective-c运行时“扩展”retain方法。我会给出公正的警告,目前为止我没有希望能够得到它的工作,而且我很快就会回到上述performSelector调用的更频繁的日志。

祝你好运!

编辑自从我写这个,我已经发现的核心基础功能:

NSLog("RetainCount: %ld", (CFGetRetainCount((__bridge CFTypeRef) anInstance)); 

这可能不是在所有箱子工作,但最多的,肯定的。见The documentation

+0

我想这是你现在可以做的最好的... 我最终发现了为什么仪器崩溃并将其用于原始问题 – yonix 2012-07-10 09:05:34

+0

很酷。我还在关于CFGetRetainCount的答案中添加了一个注释,我最近才发现它。 – 2012-07-10 13:08:53

您是否尝试过设置Exception断点? 断点面板,左下角的“+”,“添加异常断点...”,“完成” 如果您可以将异常隔离到一行,则应该能够确定哪个对象行为异常。希望这可以帮助:)

+0

有没有例外,这是一个逻辑错误,因为一个对象应该被释放,但仍然活着。 – yonix 2012-03-13 16:24:39