1.MRC下给一个已经销毁的对象就会崩溃,
NSObject *object = [[NSObject alloc]init]; NSLog(@"释放前------%lu",[object retainCount]); [object release]; // 会崩溃,报错: EXC_BAD_ACCESS (code=1, address=0x3d92e8185228) NSLog(@"释放后------%lu",[object retainCount]);
2.向nil对象发送消息就没问题
NSObject *object = [[NSObject alloc]init]; NSLog(@"释放前------%lu",[object retainCount]); object = nil; NSLog(@"释放后------%lu",[object retainCount]);
注意: objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的。那么,如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误。
这里就要区分空指针和野指针,
野指针:已经销毁被释放的对象,指针指向的内存已经不可用,称为野指针;
野指针非常危险,所以一个好的做法是把他置为nil;
空指针:对象被赋值为nil,被称为空指针。