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