我是objective和xcode的新手,我目前正在编写的一个应用程序正在接收臭名昭著的EXC_BAD_ACCESS错误。
几乎每个人都建议开始使用NSZombies解决问题。我想我已经开始使用NSZombies了,但是xcode并没有提醒我,当应用程序崩溃时,会有一个僵尸被发送消息。
在继续调试之前,我想运行一些代码,这些代码肯定会导致消息被发送到僵尸(非分配对象)。
什么是一个简单的代码片段,其中将消息发送到已释放的对象,从而导致NSZombies应该提醒我的情况?
发布于 2015-08-14 18:07:43
对于非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指针,尽管您不会找到任何*,并再次检查正确的转换是否用于抛入Cocoa对象的CoreFoundation对象。
*如果您的项目需要在10.7之前支持OS版本,或者iOS版本早于5.0,那么您就不能使用__weak指针,因此在这类项目中,您可能会发现__unsafe_unretained使用得更频繁。
发布于 2015-08-18 06:27:59
您可以创建一个CF对象,将其连接到object对象,然后释放它并尝试使用桥接对象。我认为您必须使用__bridge来实现您想要的行为方式。
https://stackoverflow.com/questions/32016040
复制相似问题