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

sim*_*one 7 debugging xcode instruments dealloc automatic-ref-counting

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

  1. 我是继承NSOperation类的
  2. 我为此操作设置了完成块
  3. 该操作由非常扁平的对象(没有方法,自动ivars,两个强属性)的强属性引用,可以调用此对象DataRequest
  4. 遵循所有准则,完成块仅使用对本地对象的弱引用(包括操作本身)
  5. 编译器和分析器都不会产生任何问题
  6. DataRequest保持对我生成的操作的唯一引用,并在操作完成块中销毁.它总是被破坏(它dealloc总是被执行)
  7. 我的操作有一个习惯dealloc.我只有一个NSLog调用.

......问题是:

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

如果我在仪器中运行它,一切都很好,系统控制台打印消息,Allocations仪器报告从正确的堆栈快照中释放的操作,包括自定义dealloc.没有检测到泄漏.

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

最后最令人困惑的事情:如果我创建了一个自定义版本[DataRequest dealloc]并且我付诸实践self.operation = nil;- 即使从调试器中也可以正常工作.

有没有人提示某些编译器链接器选项试图看到一些区别?这可能是Apple工具中的错误(我们所有人都在为我们自己的错误指责一条大鱼,对吧?)

......是的,我尝试过使用GDB和LLDB.结果是一样的 - 可能表明什么.

我试图创建一个简约的样本,但它只是工作(确实);)

谢谢

Ray*_*ite 7

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

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

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