我花了一些时间调试ARC和自定义dealloc函数的奇怪问题。
NSOperation
class DataRequest
DataRequest
保存对我生成的操作的唯一引用,并在操作完成块中销毁。它总是被破坏(它的dealloc
总是被执行)dealloc
。我只有一个NSLog调用。......问题是:
如果我在调试器中运行它,dealloc中的断点永远不会被命中,日志消息永远不会出现。主要是我认为手术漏了。
如果我在乐器中运行它,一切都很好,系统控制台会打印消息,Allocations仪器会报告正在从包含自定义dealloc的正确堆栈快照中释放的操作。没有检测到泄漏。
我100%确定我使用相同的编译器设置进行调试和分析。
最后最令人困惑的事情:如果我创建了[DataRequest dealloc]
的自定义版本并将self.operation = nil;
添加到其中 - 即使从调试器中也可以正常工作。
是否有人提示某些编译器链接器选项试图看到一些区别?这可能是Apple工具中的错误(我们所有人都在为我们自己的错误指责一条大鱼吗?)
...是的,我尝试过使用GDB和LLDB。结果是一样的 - 可能表明什么。
我试图创建一个简约的样本,但它只是起作用(的确);)
由于
答案 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)
我今天遇到了同样的问题,但我的问题是由一个块产生的保留周期。
如果你正在使用积木: