首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标-c示例代码,该代码有意向已释放的对象发送消息。

目标-c示例代码,该代码有意向已释放的对象发送消息。
EN

Stack Overflow用户
提问于 2015-08-14 17:55:35
回答 2查看 475关注 0票数 5

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

几乎每个人都建议开始使用NSZombies解决问题。我想我已经开始使用NSZombies了,但是xcode并没有提醒我,当应用程序崩溃时,会有一个僵尸被发送消息。

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

什么是一个简单的代码片段,其中将消息发送到已释放的对象,从而导致NSZombies应该提醒我的情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-14 18:07:43

对于非ARC代码:

代码语言:javascript
复制
- (IBAction) messageZombie:(id)sender {
    id a = [[NSObject alloc]init];
    [a release];
    NSLog(@"%@", [a description]);
}

这将为您提供关闭僵尸的EXC_BAD_ACCESS,以及启用僵尸的“发送到已分配实例的消息”消息。

如果您的项目正在使用ARC,那么可靠地向取消分配的对象发送消息就更难了(这毕竟是ARC的重点)。

这样做是可行的:

代码语言:javascript
复制
- (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使用得更频繁。

票数 7
EN

Stack Overflow用户

发布于 2015-08-18 06:27:59

您可以创建一个CF对象,将其连接到object对象,然后释放它并尝试使用桥接对象。我认为您必须使用__bridge来实现您想要的行为方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32016040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档