Objective-C的示例代码有意消息的解除分配的对象

问题描述:

我新的目标cxcode的和一个应用程序我目前正在写在接收臭名昭著EXC_BAD_ACCESS错误。Objective-C的示例代码有意消息的解除分配的对象

几乎所有人都推荐使用NSZombies来解决问题。我认为我有NSZombies的工作,但xcode是不是给我一个关于僵尸当我的应用程序崩溃消息警报。

在继续我的调试之前,我想运行一些代码,以确保将消息发送到zombie(取消分配的对象)。

什么是一个简单的代码片段,其中一条消息被发送到一个释放对象,导致一个场景NSZombies应该提醒我?

+1

@zaph不,这是内存泄漏。僵尸是一个指向释放对象的指针。 – rmaddy

+0

@zaph如果你有僵尸启用,僵尸是当你释放一个对象时留下的东西。僵尸不会释放那些内存,而是拥有该内存,并在发送消息时提醒你 - 这应该是一个释放对象。 –

+1

@zaph僵尸(作为调试工具)的重点在于找到一些情况,即指针仍然位于已释放的对象的周围,然后尝试访问该对象。 – rmaddy

对于非ARC代码:

- (IBAction) messageZombie:(id)sender { 
    id a = [[NSObject alloc]init]; 
    [a release]; 
    NSLog(@"%@", [a description]); 
} 

这会给你EXC_BAD_ACCESS僵尸了,和“消息发送到释放实例”的消息,并启用僵尸。

如果您的项目正在使用ARC,那么可靠地导致消息解除分配对象(毕竟是ARC的)有点困难。

这工作:

- (IBAction) messageZombie:(id)sender {  
    id a = [[NSObject alloc]init]; 
    id __unsafe_unretained b =a; 
    a=nil; 
    NSLog(@"%@", [b description]); 
} 

它可能不是非常相似,你的实际代码是干什么的,因为谁到底采用__unsafe_unretained啊?但是如果你只是想确保NSZombies正常开启,这应该是一个合理的测试用例。

如果您在代码中查找可疑的地方,那么一定要查找__unsafe_unretained指针,尽管您不会找到任何*,并仔细检查是否将正确的演员用于转换为CoreFoundation对象可可物体。

*如果您的项目需要支持10.7之前的OS X版本或5.0之前的iOS版本,那么您不能使用__weak指针,因此在那类项目中,您会希望更频繁地使用__unsafe_unretained 。

+1

当然这是非ARC代码。 – zaph

+0

@MarkBessey谢谢,这是我正在寻找的,唯一的问题是,我有自动引用计数启用,我得到的错误:“ARC禁止明确的消息发送'释放'” –

+4

这可能不会实际上崩溃,甚至与僵尸关闭。 – rmaddy

您可以创建一个CF对象,将其连接到Objective-C对象,然后释放它并尝试使用桥接对象。我想你必须使用__bridge才能让它按照你想要的方式行事。