我是
Objective-c和xcode的新手,我正在编写的应用程序正在收到臭名昭着的EXC_BAD_ACCESS错误.
几乎每个人都建议使用NSZombies开始解决问题.我想我有NSZombies正在工作,但xcode没有给我一个关于当我的应用程序崩溃时收到消息的僵尸的警报.
在继续我的调试之前,我想运行一些代码,这些代码肯定会导致消息被发送到僵尸(解除分配的对象).
什么是简单的代码片段,其中消息被发送到解除分配的对象,导致NSZombies应该提醒我的情况?
解决方法
对于非ARC代码:
- (IBAction) messageZombie:(id)sender { id a = [[NSObject alloc]init]; [a release]; NSLog(@"%@",[a description]); }
这将为您提供关闭Zombies的EXC_BAD_ACCESS,以及启用Zombies的“发送到解除分配实例的消息”消息.
如果您的项目使用ARC,那么可靠地导致消息取消分配对象(毕竟这是ARC的重点)有点困难.
这有效:
- (IBAction) messageZombie:(id)sender { id a = [[NSObject alloc]init]; id __unsafe_unretained b =a; a=nil; NSLog(@"%@",[b description]); }
它可能与你的实际代码所做的不太相似,因为无论如何,heck使用了__unsafe_unretained?但是如果你只是想确保你已经正确启用了NSZombies,这应该是一个合理的测试用例.
如果你在代码中寻找可疑的地方,那么一定要查找__unsafe_unretained指针,尽管你找不到任何*,并仔细检查右转换是否用于转换为Cocoa对象的CoreFoundation对象.
*如果您的项目需要支持10.7之前的OS X版本或5.0之前的iOS版本,那么您不能使用__weak指针,因此在这种项目中,您希望找到更频繁使用的__unsafe_unretained.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。