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

时间:2012-03-13 16:11:42

标签: ios release automatic-ref-counting retain xcode-instruments

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

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

有关如何在没有乐器的ARC中完成此操作的任何建议吗?

2 个答案:

答案 0 :(得分:2)

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

使用ARC,编译器不允许你询问retainCount,它甚至足以阻止你执行performSelector:@selector(retainCount)。但是,我并没有放弃,而是更进一步,以获得访问这个有用的调试指示器。

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

这已经过了编译器,并将在幕后揭示更多内容。它不是堆栈,但是通过多次记录此值,您可以获得一些提示。

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

祝你好运!

编辑自从我写这篇文章以来,我发现了Core Foundation的功能:

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

哪些所有案例可能无效,但大多数情况下肯定无效。请参阅The documentation

答案 1 :(得分:0)

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

相关问题