Iphone 目标-C“;发送到解除分配实例0x5633b0的消息“;

Iphone 目标-C“;发送到解除分配实例0x5633b0的消息“;,iphone,objective-c,Iphone,Objective C,在我的obj-C应用程序中,我似乎有一些过于热心的发布——获取错误消息 “-[myobj release]:消息已发送到解除分配的实例0x5633b0” 。我知道引起问题的对象实例的类,但是这个类被用来创建许多实例 我的想法是,我可以在类的init方法中添加一些日志记录,以记录“0x5633b0”对应的任何内容,这将帮助我跟踪实例的创建位置 “0x5633b0”到底是什么?我有没有办法访问代码中的该值来记录它 谢谢。0x5633b0可能是相关对象的地址(self的值)。您可以将NSLog或pri

在我的obj-C应用程序中,我似乎有一些过于热心的发布——获取错误消息

“-[myobj release]:消息已发送到解除分配的实例0x5633b0”

。我知道引起问题的对象实例的类,但是这个类被用来创建许多实例

我的想法是,我可以在类的init方法中添加一些日志记录,以记录“0x5633b0”对应的任何内容,这将帮助我跟踪实例的创建位置

“0x5633b0”到底是什么?我有没有办法访问代码中的该值来记录它


谢谢。

0x5633b0
可能是相关对象的地址(self的值)。您可以将
NSLog
printf
%p
一起使用来打印它。

您没有正确管理内存--您在某些对象上调用
release
/
autorelease
的次数比调用
retain
的次数要多。确保您遵守了本手册中列出的所有规则

0x5633b0只是存储对象的内存位置的地址。您可以尝试向
init
方法添加一些代码:

- (void) init
{
    if(self == (MyClass*)0x5633b0)
        NSLog(@"Allocated object at address 0x5633b0");  // put a breakpoint on this line
    // do rest of init...
}

如果您有任何其他
init
方法(例如,
initWithCoder:
,它是为从XIB实例化的对象调用的),请确保将此代码段也放在这些方法中。在
NSLog
行上放置一个断点,然后查看它何时被击中。请注意,如果一个对象在该地址分配、解除分配,然后另一个对象恰好在同一地址重新分配,它可能会被命中多次。崩溃前的最后一次点击是您想要的。

在调试器中,键入
信息符号0x5633b0
,您将得到一些关于它是什么对象的指示。另一件可能有用的事情是
backtrace
,它将为您提供堆栈跟踪。总而言之,我有一些很好的建议。

当我最近遇到类似问题时,最适合我的是以下几点:

  • 在项目->编辑活动可执行文件->参数选项卡->环境变量部分下,我添加并设置了以下变量:
    NSAutoreleaseFreedObjectCheckEnabled
    NSZombieEnabled
    NSDebugEnabled

  • 在Run菜单下,我选择了EnableGuard Malloc

  • 通过这些设置,调试器提供了更多关于代码错误的提示

    (我找到了这些提示)

    祝你好运,
    Ori

    您还可以将这些添加到环境变量中:
    mallocstacklogginnocompact 1

    并在gdb控制台中写入:
    info malloc历史记录


    参考:

    0x5633b0
    可能是解除分配对象的地址(myobj的值)。您可以使用
    NSLog
    printf
    %p
    来打印它

    您还可以使用instruments profiler查找解除分配的对象

    1。启动探查器:

    2。选择“僵尸”并启动探查器。

    3。单击模拟器,直到您遇到“解除分配错误案例”

    考虑一下


    然后,您将知道您正在发送消息的解除分配对象是什么。

    就是这样-我只是需要一种方法以某种方式获取对象的地址。我添加了:NSLog(@“INIT%p”,self);并能够判断是哪个实例导致了问题。谢谢。您可以在“-[\n僵尸方法签名选择器:]”中添加一个断点,以便在记录“已发送到解除分配实例的消息…”时使调试器停止。嘿,kenji,您能帮个忙吗[\n僵尸方法SignatureForSelector:举个例子,你如何事先知道符号的地址?每次运行代码时不是都不一样吗?至少我注意到了。使用类似“info symbol 0xabcdfg”的东西在调试器控制台中,我得到了比您的probosal更好的结果。启用Guard Malloc在设备上调试时不起作用,至少我不能,这篇文章证实了这一点:@JeroenEijkhof是对的。Guard Malloc在设备上不起作用。它们可以在“diagnostice”选项卡中启用,无需在env var中设置。但是NSAutoreleaseFreedObjectCheckEnabled可能需要设置为env var。使用
    lldb
    is
    图像查找-地址0x1ec4
    或短版本
    im loo-a 0x1ec4
    。为什么您的答案的开头完全复制了@LoganCapaldo的答案?我一定复制了它,从未回头看过。谢谢您的指点。我在那里添加了一些解释。三年后:非常感谢。