调试循环保留在ARC中,无需仪器



在ARC之前的时代,我可以覆盖保留、释放并记录堆栈跟踪,然后很容易地找到保留我的对象和不应该保留的地方。

现在禁止这样做,有时运行仪器也不是一种选择(例如,当我试图在设备上运行我的应用程序时,它就会崩溃,而且错误不会在模拟器中重现)。

有什么建议可以在没有仪器的情况下在ARC中做到这一点吗?

我可能没有最终答案,但我将分享我决定尝试的一种技术,这是朝着正确方向迈出的一步。

使用ARC,编译器将不允许您询问retainCount,它甚至足够聪明,可以阻止您执行performSelector:@selector(retainCount)。然而,我并没有放弃,而是更进一步地访问了这个有用的调试指标。

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

这将通过编译器,并将显示更多的隐藏信息。它不是堆栈,但有了这个值的大量日志记录,你可以得到一些提示。

我可能会放弃它,但我正在使用一种更棘手(读作:更丑陋)的技术来获得堆栈。其基本思想是通过objective-c运行时"扩展"retain方法,使用class_addMethod()或method_setImplementation。我要发出一个公平的警告,到目前为止,我几乎没有希望让它发挥作用,我可能很快就会回到更频繁的上述性能选民电话记录中。

祝你好运!

edit自从我写这篇文章以来,我发现了核心基础函数:

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

这可能不适用于所有的情况,但可以肯定的是,大多数情况都适用。请参阅文档。

您尝试过设置异常断点吗?断点面板,左下角"+","添加异常断点…","完成"如果您可以将异常隔离到一行,那么您应该能够确定哪个对象行为不端。希望这有帮助:)

最新更新