iOS对象的安全释放

在释放了一个对象,再次访问时就会出现野指针错误。

控制台就会打印错误信息:[NSObject isProxy]: message sent to deallocated instance 0x604000017d70

我们可以开启MRC环境下测试:-fno-objc-arc

NSObject *objc = [NSObject new];
//释放对象,可是并没有修改对象的指针地址
[objc release];  
//再次访问时就出现野指针错误
NSLog(@"%@",objc);

开启僵尸对象,就会发现objc对象已变成了僵尸对象


iOS对象的安全释放_第1张图片
zombie.png

想要安全释放对象,上面示例代码改成:

NSObject *objc = [NSObject new];
//释放对象,可是并没有修改对象的指针地址
[objc release];  
//这句是把对象objc 地址指向NULL的空对象
objc = nil;
//在OC中调用方法,在运行时会其实是向一个对象发送消息,而 nil 对象发送消息是不会报错
NSLog(@"%@",objc);

所以对象release之后并没有修改对象的指针地址,再次访问时就会出现野指针错误,想要安全释放,就要在release之后把对象置空(objc = nil),再次访问(调用方法)时,在运行时调用方法其实是向对象发送消息,OC中向nil发送消息是不会出现crash,这样就能达到安全释放。

你可能感兴趣的:(iOS对象的安全释放)