【发布时间】:2011-12-06 21:08:33
【问题描述】:
我花了一些时间调试 ARC 和自定义 dealloc 函数的一个奇怪问题。
- 我正在继承
NSOperation类 - 我为此操作设置了完成块
- 该操作被 very 平面对象的强属性引用(无方法,自动 ivars,两个强属性)让我们将此对象称为
DataRequest - 按照所有准则,完成块仅使用对本地对象的弱引用(包括操作本身)
- 编译器和分析器都不会产生任何问题
-
DataRequest持有对我生成的操作的唯一引用,并在操作完成块中被销毁。它总是被销毁(它的dealloc总是被执行) - 我的操作有一个自定义
dealloc。我只有一个 NSLog 调用。
...问题是:
如果我在调试器中运行它,dealloc 中的断点永远不会命中,日志消息永远不会出现。主要是我认为操作泄露了。
如果我在仪器中运行它,一切都很好,系统控制台会打印消息,并且分配仪器报告操作正在从正确的堆栈快照中释放,包括自定义的 dealloc。未检测到泄漏。
我 100% 确定我使用相同的编译器设置进行调试和分析。
最后最令人困惑的事情是:如果我创建了 [DataRequest dealloc] 的自定义版本并将 self.operation = nil; 放入其中 - 即使在调试器中也一切正常。
有没有人有一些提示什么编译器链接器选项来尝试看到一些差异?这可能是 Apple 工具中的错误吗(我们所有人都处于将自己的错误归咎于大鱼的位置,对吗?)
...是的,我尝试过使用 GDB 和 LLDB。结果是一样的——这可能表明了什么。
我试图创建一个简约的示例,但它确实有效;)
谢谢
【问题讨论】:
-
我做了一个非常基本的观察......如果我从 XCode(GDB 或 LLDB)在模拟器上运行应用程序,我在
dealloc中的日志消息不会打印出来。如果我只是退出调试器并直接从模拟器启动应用程序 - Console.app 会显示所有消息。没有编译之间没有链接。奇怪。 -
...还有一个更直接的结果...如果我在调试会话中从 XCode 运行应用程序 - 如果我在模拟器中手动运行应用程序,则不会调用 dealloc(不打印日志)然后附加调试器......一切都如预期的那样。
标签: xcode debugging instruments dealloc automatic-ref-counting