如何使用Xcode检测被双重释放的对象 - 发送到解除分配的实例的消息?

时间:2011-08-18 10:17:07

标签: objective-c xcode4

我对Xcode4比较陌生,我想知道如何用它识别双版本。

在调试器中,我看到一行*** -[NSConcreteMutableData release]: message sent to deallocated instance 0x60b63fe0

问题在于知道地址对识别对象没有多大帮助,对象类型也没有太多帮助识别它。

我读过http://www.friday.com/bbum/2010/01/10/using-malloc-to-debug-memory-misuse-in-cocoa/,但我没有发现这太成功了。

5 个答案:

答案 0 :(得分:6)

您可以启用NSZombieEnabled环境变量 - 有关如何在Xcode 4上执行此操作的说明,请参阅How do I set up NSZombieEnabled in Xcode 4?

这意味着释放的对象保留在内存中,因此调试器仍然可以找到对象的类型。发生崩溃时,会告诉您有问题的对象。

“Zombies”Instruments工具非常适合检测此类错误 - 它实际上启用了NZZombieEnabled,您可以使用它来确切地找出发生崩溃的代码行。

答案 1 :(得分:1)

您可以使用类别替换发布方法以用于测试目的,这不是设计为作为语言的一部分工作,但在过去我已经找到成功它尝试做一些测试,通常你发现所有你发现的是自动释放池正在释放你的对象。

答案 2 :(得分:0)

您正在向已发布或具有retainCount 0的内容发送一条释放消息。因此,它会给出这样的错误消息。实际上,我对here的回答可能有所帮助。

答案 3 :(得分:0)

使用Zombies的探查器跟踪实际对象。它将自动启用NSZombies,更重要的是保留所有发布和自动发布消息的历史记录。

  1. 使用产品下的Profile菜单命令。
  2. 在显示的性能分析模板选择对话框中,选择Zombies。
  3. 单击工具栏中的“录制”按钮(Command-R)开始录制。正常使用您的应用。如果对取消分配的对象进行了调用,则会在时间轴窗格中插入一个标志,并显示一个Zombie Messaged对话框。
  4. 单击僵尸内存地址旁边的焦点箭头,在详细信息窗格中显示僵尸对象的内存历史记录,以及相应的引用计数和方法调用。
  5. 这是带图片的苹果文档:

    https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/EradicatingZombies.html

答案 4 :(得分:-1)

尝试使用属性retainCount。如果一个对象有retainCount == 0,那么它将被释放。最终,您将无法向其发送release消息。