Objective-C "message sent to deallocated instance 0x5633b0" (该内容不需要翻译)
Objective-C "message sent to deallocated instance 0x5633b0" (该内容不需要翻译)
我在我的obj-C应用程序中似乎存在一些过度释放的问题 - 出现错误信息\n
\n“-[myobj release]: message sent to deallocated instance 0x5633b0”\n
\n。我知道导致问题的对象实例的类,但是这个类在许多地方都用于创建许多实例。\n我想,我可以在该类的init方法中添加一些日志记录,以记录与“0x5633b0”对应的内容,这应该有助于我追踪实例的创建位置。\n“0x5633b0”究竟是什么,我是否可以在代码中获取该值以进行日志记录?\n谢谢。
Objective-C中的“message sent to deallocated instance 0x5633b0”问题通常是由于尝试向已被释放的对象发送消息引起的。解决这个问题的方法如下:
1. 确定错误信息中的地址:0x5633b0
是被释放对象的地址,可以使用NSLog
或printf
配合%p
打印该地址。
2. 使用Instruments工具来查找被释放的对象:
a. 启动Instruments工具;
b. 选择"Zombies"并启动Profiler;
c. 运行模拟器,直到出现"deallocated error case",并点击进入。
以上方法可以帮助我们定位到被释放的对象,从而解决“message sent to deallocated instance”问题。
为什么你的答案一开始完全复制了某个人的答案?
我可能复制了它,然后没有再次查看。感谢你指出来。我在那里添加了更多的解释。
三年后:谢谢你!
在Objective-C中,当我们向一个已被释放的实例发送消息时,就会出现"message sent to deallocated instance"的错误。这个错误的原因是我们试图向一个已经不存在的对象发送消息,导致程序崩溃。
解决这个问题的方法是在代码中找到导致错误的地方,并修复它。下面是一些可能的解决方法:
1. 打印对象地址:通过打印对象的地址,我们可以确定造成问题的实例。可以使用NSLog或printf函数以%p的格式打印地址。例如,在init方法中添加如下代码:NSLog(@"INIT %p", self);。
2. 添加断点:可以在"-[_NSZombie methodSignatureForSelector:]"方法上添加断点,当日志中出现"message sent to deallocated instance"时,调试器会暂停程序执行,方便我们查找问题。
以上就是解决"message sent to deallocated instance"问题的方法。通过定位问题的源头并修复它,我们可以避免该错误,并使程序正常运行。
Objective-C中的"message sent to deallocated instance 0x5633b0"问题是由于向已释放的实例发送消息而引起的。解决此问题的方法是在项目设置中进行一些调整。
我最近遇到类似问题时,以下方法对我效果最好:
1. 在项目设置中,点击"Project->Edit Active Executable -> Arguments"选项卡,找到"Environment variables"部分,添加并设置以下变量为YES:NSAutoreleaseFreedObjectCheckEnabled
、NSZombieEnabled
和NSDebugEnabled
。
2. 在运行菜单中,选择"Enable Guard Malloc"。
通过这些设置,调试器将提供有关代码错误的更多线索。
此外,有人指出"Enable Guard Malloc"在设备上调试时无效,可以在此处找到相关讨论。确实如此,Guard Malloc在设备上无法正常工作,而在"diagnostice"选项卡中可以启用它,因此无需在环境变量中设置。但是,可能需要将NSAutoreleaseFreedObjectCheckEnabled
设置为环境变量。
祝好运!
Ori