OC向一个已经释放的对象发送消息会怎样

OC向一个已经释放的对象发送消息会怎样

 

关键字:MRC、ARC、EXC_BAD_INSTRUCTION、deallocated

 

一、提出问题

 

在OC向一个已经释放的对象发送消息会出现什么情况呢?

 

二、作出假设

 

向一个已经释放的对象发送消息,程序会闪退。

 

三、验证问题

 

1、创建MRC工程

 

为了方便验证,我们使用MRC来测试。

 

创建一个工程,将环境切换到MRC,target的Build Settings下搜索,Objective-C Automatic Reference Counting,将Objective-C Automatic Reference Counting设置为NO 。

 

2、创建一个对象Person

 

添加一个eat方法,方法里打印“吃饭”

 

3、向释放掉的Person对象发送一个eat消息

 

在ViewController里面

 

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *p = [[Person alloc] init];
    [p eat];
    [p release]; //调用release,释放p
    [p eat]; //向已经释放掉的p对象,发送一个eat的消息
}

 

 

 

(1)运行此程序;

 

(2)再在[p release]这行打断点,让程序执行到前一行,p未释放的时候,在lldb里面po p。

 

4、结果

 

(1)运行程序直接闪退到[p eat]这一行,闪退信息如下:

 

[p eat]行报错信息

 

 

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

 

 

lldb里面log

 

 

2018-03-27 16:20:12.558905+0800 Runloop[2930:216258] *** -[Person eat]: message sent to deallocated instance 0x60000000b6d0

 

 

 

(2)断点调试,po p回车

 

 

(lldb) po p
2018-03-27 16:31:50.075191+0800 Runloop[3052:225294] *** -[Person respondsToSelector:]: message sent to deallocated instance 0x60000000b060
0x000060000000b060

(lldb) 

 

 

 

 

 

四、得出结论

 

在OC中向一个被释放了的对象发送消息,程序直接闪退,并报有如下主要错误信息:EXC_BAD_INSTRUCTION、message sent to deallocated instance

 

 

 

[参考资料EXC_BAD_ACCESS](http://www.cocoachina.com/ios/20160226/15324.html)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值