7

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

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

...问题是:

如果我在调试器中运行它,则永远不会命中 dealloc 中的断点,永远不会出现日志消息。首先,我认为该操作正在泄漏。

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

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

最后最令人困惑的事情是:如果我创建了一个自定义版本[DataRequest dealloc]并投入self.operation = nil;使用 - 即使在调试器中也一切正常。

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

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

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

谢谢

4

3 回答 3

7

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

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

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

于 2011-10-21T21:43:13.790 回答
1

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

如果您使用块:

  1. 确保 SELF 不出现在块内。
  2. 如果您需要在块内使用 SELF,请使用弱引用。
  3. 确保块内没有可能引用自身的宏(如 NSAssert)。
于 2014-03-29T00:29:38.987 回答
1

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

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

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

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

不知道这个变化是由于ios5中的一个bug在ios6中已经打了补丁,还是引入了一个特性回滚了。

希望有帮助...

于 2013-02-15T16:48:52.150 回答