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

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


关键字:MRCARCEXC_BAD_INSTRUCTIONdeallocated


一、提出问题


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


二、作出假设


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


三、验证问题


1、创建MRC工程


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


创建一个工程,将环境切换到MRCtargetBuild 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_INSTRUCTIONmessage sent to deallocated instance




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


猜你喜欢

转载自blog.csdn.net/morris_/article/details/79719394