【问题标题】:Debugging circular retains in ARC without instruments在没有工具的情况下在 ARC 中保留调试通知
【发布时间】:2012-03-13 16:11:42
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    祝你好运!

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

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

    这可能不适用于所有情况,但大多数情况下是肯定的。见The documentation

    【讨论】:

    • 我想这是你现在能做的最好的事情......我最终找出了仪器崩溃的原因并将其用于我最初的问题
    • 酷。我还在我的回答中添加了一条关于我最近才发现的 CFGetRetainCount 的注释。
    【解决方案2】:

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

    【讨论】:

    • 也不例外,这是一个逻辑错误,因为一个对象本应被解除分配但仍然存在。
    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多