我花了一些时间调试 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/