Xcode 和 ARC 调试问题(跳过 dealloc)

标签 xcode debugging instruments dealloc automatic-ref-counting

我花了一些时间调试 ARC 和自定义 dealloc 函数的一个奇怪问题。

  • 我正在继承 NSOperation类(class)
  • 我为此操作设置了完成块
  • 该操作由 的强属性引用。非常平面对象(没有方法,自动变量,两个强大的属性)让我们调用这个对象 DataRequest
  • 遵循所有准则,完成块仅使用对本地对象(包括操作本身)的弱引用
  • 编译器和分析器都不会产生任何问题
  • DataRequest持有对我生成的操作的唯一引用,并在操作完成块中销毁。它总是被销毁(它的 dealloc 总是被执行)
  • 我的操作有自定义dealloc .我只有一个 NSLog 调用。

  • ......问题是:

    如果我在调试器中运行它,dealloc 中的断点永远不会被命中,日志消息永远不会出现。主要是我以为手术漏水了。

    如果我在仪器中运行它,一切都很好,系统控制台会打印消息,并且分配仪器会报告从正确的堆栈快照(包括自定义 dealloc)中释放的操作。未检测到泄漏。

    我 100% 确定我使用相同的编译器设置进行调试和分析。

    最后最迷惑的一点:如果我创建了[DataRequest dealloc]的自定义版本我把 self.operation = nil;对它 - 即使在调试器中也能正常工作。

    有没有人有一些提示什么编译器链接器选项可以尝试看到一些差异?这可能是 Apple 工具中的错误(我们所有人都将自己的错误归咎于一条大鱼,对吗?)

    ...是的,我已经尝试过 GDB 和 LLDB。结果是一样的——什么可能表明什么。

    我试图创建一个简约的示例,但它确实有效(确实);)

    谢谢

    最佳答案

    你有 NSZombiesEnabled 吗?我们遇到了同样的问题,并通过禁用 NSZombies 来“解决”它。

    “产品”->“方案”->“编辑方案”->“诊断”->取消选中“启用僵尸对象”

    我不确定为什么在启用 NSZombies 时不调用 dealloc(我很确定它是在 ARC 之前调用的)。

    关于Xcode 和 ARC 调试问题(跳过 dealloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7753197/

    相关文章:

    objective-c - block 捕获对象的过度释放问题;保留计数从 +2 直接跳到 0!

    ios - 什么被认为是 iOS 应用程序中的高内存使用率?

    ios - 如何在 Swift 中定义初始化泛型类型

    ios - 我们可以使用 iOS 7 SDK 并仍然支持低于 7 的 iOS 版本吗?

    visual-studio - Visual Studio 的 "Start Without Debugging"在 JetBrains Rider 中是否等效?

    debugging - 转储匿名函数的源代码

    c++ - 找不到 Xcode build设置 - GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS

    ios - Xcode 6 中的可编辑多行文本输入

    debugging - 如何部署和调试 wdk 8 内核模式驱动程序

    ios - 仪器工具中的分配列表