Xcode和ARC调试问题(跳过解除锁定)
我花了一些时间调试ARC和自定义dealloc函数的一个奇怪问题Xcode和ARC调试问题(跳过解除锁定),xcode,debugging,instruments,dealloc,automatic-ref-counting,Xcode,Debugging,Instruments,Dealloc,Automatic Ref Counting,我花了一些时间调试ARC和自定义dealloc函数的一个奇怪问题 我正在对NSOperation类进行子类化 我为此操作设置了完成块 该操作由very平面对象(无方法、自动IVAR、两个强属性)的强属性引用。让我们调用此对象DataRequest 遵循所有准则,完成块仅使用对本地对象(包括操作本身)的弱引用 编译器和分析器都不会产生任何问题 DataRequest保存对我生成的操作的唯一引用,并在操作完成块中销毁。它总是被销毁(它的dealloc总是被执行) 我的操作有一个自定义的dealloc
NSOperation
类进行子类化DataRequest
DataRequest
保存对我生成的操作的唯一引用,并在操作完成块中销毁。它总是被销毁(它的dealloc
总是被执行)dealloc
。我只有一个NSLog调用[DataRequest dealloc]
,我将self.operation=nil代码>到它-即使从调试器中也可以正常工作
是否有人有一些提示什么编译器链接器选项试图看到一些差异?这可能是苹果工具中的错误吗(我们所有人都将自己的错误归咎于一条大鱼,对吧?)
。。。是的,我尝试过GDB和LLDB。结果是一样的——这可能意味着什么
我曾尝试创建一个极简主义的示例,但它(确实)奏效了;)
谢谢您是否启用了NSzombiesenable?我们有同样的问题,并通过禁用NSZombies“解决”了它
“产品”->“方案”->“编辑方案”->“诊断”->取消选中“启用僵尸对象”
我不确定为什么在启用NSzombie时不调用dealloc(我很确定它是在ARC之前调用的)。我今天遇到了同样的问题,我花了大约5个小时才发现问题是由我的项目设置中启用的NSzombie引起的
我也同意在ARC之前,dealloc在本案中被调用
经过多次测试,如果使用iOS 5.x(设备或模拟器),似乎不会调用dealloc
但它在iOS 6.x(设备或模拟器)中再次被调用(启用了僵尸)
我不知道这一变化是由ios5中的一个bug引起的,该bug是在ios6中修补的,还是由引入并回滚的特性引起的
希望这有帮助…我今天遇到了同样的问题,但我的问题是一个块生成的保留周期
如果您使用的是块:
确保SELF不会出现在块内
如果需要在块内使用SELF,请使用弱引用
确保块内没有引用self的宏(如NSAssert)
我做了一个非常基本的观察。。。如果我从XCode(GDB或LLDB)在模拟器上运行应用程序,dealloc
中的日志消息不会打印出来。如果我退出调试器并直接从模拟器启动应用程序,那么Console.app会显示所有消息。没有编译,没有链接。奇怪。。。。还有一个更直接的结果。。。如果我在调试会话中从XCode运行应用程序-如果我在模拟器中手动运行应用程序,然后附加调试器,则不会调用dealloc(未打印日志)。。。一切如预期。我必须测试-但是的,我有NSZombiesEnabled设置。这听起来很有可能——至少它对不同的行为给出了一些合理的解释。我可以确认NSZombiesEnabled是造成问题的原因。非常感谢!当使用NSZombiesEnabled with ARC时,这可能会发生在任何地方,而不仅仅是使用NSOperation
。如果使用ARC观察dealloc的怪异性,关键是禁用NSZombiesEnabled(在Xcode 4的编辑方案…>Diagnostics选项卡中标记为“已启用的僵尸对象”)。未调用dealloc的原因是该对象从未解除分配。它被阻止这样做,而是变成了一个“僵尸”@borrrden我认为它可以被释放,只是被同一地址的僵尸对象所取代。好了,弧前就是这样的。