Xcode和ARC调试问题(跳过解除锁定)

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

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

  • 我正在对
    NSOperation
    类进行子类化
  • 我为此操作设置了完成块
  • 该操作由very平面对象(无方法、自动IVAR、两个强属性)的强属性引用。让我们调用此对象
    DataRequest
  • 遵循所有准则,完成块仅使用对本地对象(包括操作本身)的弱引用
  • 编译器和分析器都不会产生任何问题
  • DataRequest
    保存对我生成的操作的唯一引用,并在操作完成块中销毁。它总是被销毁(它的
    dealloc
    总是被执行)
  • 我的操作有一个自定义的
    dealloc
    。我只有一个NSLog调用
  • 。。。问题是:

    如果我在调试器中运行此命令,则不会命中dealloc中的断点,日志消息也不会出现。主要是我认为手术有漏洞

    如果我在instruments中运行此操作,一切正常,系统控制台将打印消息,并报告正在从正确的堆栈快照(包括自定义dealloc)中释放的操作。未检测到泄漏

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

    最后最让人困惑的事情是:如果我创建了一个自定义版本的
    [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我认为它可以被释放,只是被同一地址的僵尸对象所取代。好了,弧前就是这样的。