1

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

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

有什么建议可以在没有仪器的情况下在 ARC 中完成吗?

4

2 回答 2

2

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

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

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

这通过了编译器,并且会在引擎盖下揭示更多内容。它不是堆栈,但通过大量记录此值,您可以获得一些提示。

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

祝你好运!

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

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

这可能并非在所有情况下都有效,但大多数情况下是肯定的。请参阅文档

于 2012-06-14T23:56:18.697 回答
0

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

于 2012-03-13T16:18:24.343 回答