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)