我花了一些时间调试 ARC 和自定义 dealloc 函数的一个奇怪问题。
- 我正在继承
NSOperation
类 - 我为此操作设置了完成块
- 该操作被非常扁平对象的强属性引用(无方法,自动 ivars,两个强属性)让我们调用这个对象
DataRequest
- 遵循所有准则,完成块仅使用对本地对象的弱引用(包括操作本身)
- 编译器和分析器都不会产生任何问题
DataRequest
持有对我生成的操作的唯一引用,并在操作完成块中被销毁。它总是被摧毁(它dealloc
总是被执行)- 我的操作有一个习惯
dealloc
。我只有一个 NSLog 调用。
...问题是:
如果我在调试器中运行它,则永远不会命中 dealloc 中的断点,永远不会出现日志消息。首先,我认为该操作正在泄漏。
如果我在仪器中运行它,一切都很好,系统控制台会打印消息,并且分配仪器报告操作正在从正确的堆栈快照中释放,包括自定义释放。未检测到泄漏。
我 100% 确定我使用相同的编译器设置进行调试和分析。
最后最令人困惑的事情是:如果我创建了一个自定义版本[DataRequest dealloc]
并投入self.operation = nil;
使用 - 即使在调试器中也一切正常。
有没有人有一些提示什么编译器链接器选项来尝试看到一些差异?这可能是 Apple 工具中的错误吗(我们所有人都处于将自己的错误归咎于一条大鱼的位置,对吗?)
...是的,我尝试过使用 GDB 和 LLDB。结果是一样的——什么可能表明什么。
我试图创建一个简约的样本,但它确实有效(确实);)
谢谢