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

时间:2011-10-13 11:08:37

标签: xcode debugging instruments dealloc automatic-ref-counting

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

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

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

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

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

    最后最令人困惑的事情:如果我创建了[DataRequest dealloc]的自定义版本并将self.operation = nil;添加到其中 - 即使从调试器中也可以正常工作。

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

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

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

    由于

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

今天我遇到了同样的问题,我花了大约5个小时才发现问题是由我的项目设置中启用的NSZombies引起的。

我也同意在ARC之前,在这种情况下调用dealloc。

经过多次测试后,如果使用iOS 5.x(设备或模拟器),似乎不会调用dealloc。

但在iOS 6.x(设备或模拟器)中再次调用它(使用Zombies)

我不知道此更改是否是由ios5中的错误导致的,该错误已在ios6中修补,或者是引入并回滚的功能。

希望有帮助...

答案 2 :(得分:1)

我今天遇到了同样的问题,但我的问题是由一个块产生的保留周期。

如果你正在使用积木:

  1. 确保SELF不会出现在块内。
  2. 如果您需要在块内使用SELF,请使用弱引用。
  3. 确保块内没有可能引用self的宏(如NSAssert)。