Objective-c示例代码有意地向一个已释放的对象发送消息



我是objective-cxcode的新手,我目前正在编写的应用程序正在接收臭名昭著的EXC_BAD_ACCESS错误。

几乎每个人都建议从NSZombies开始解决问题。我想我有NSZombies工作,但xcode并没有给我一个警报关于僵尸被消息当我的应用程序崩溃。

在继续调试之前,我想运行一些代码,这些代码肯定会将消息发送到僵尸(已分配对象)。

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

对于非arc代码:

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

这将给你一个EXC_BAD_ACCESS与僵尸关闭,和一个"消息发送到deallocated实例"的消息,与僵尸启用。

如果您的项目正在使用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指针,尽管你不会找到任何*,并仔细检查被转换为Cocoa对象的CoreFoundation对象是否使用了正确的类型转换。

*如果你的项目需要支持10.7之前的OS X版本,或者ios5.0之前的版本,那么你不能使用__weak指针,所以在这种类型的项目中,你会发现__unsafe_unretained被更频繁地使用。

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

最新更新