美文网首页
iOS对象的安全释放

iOS对象的安全释放

作者: Rambo__ | 来源:发表于2018-04-05 13:00 被阅读68次

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

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

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

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

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


zombie.png

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

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

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

相关文章

  • iOS对象的安全释放

    在释放了一个对象,再次访问时就会出现野指针错误。 控制台就会打印错误信息:[NSObject isProxy]: ...

  • ios容易造成循环引用的场景

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的...

  • 循环引用问题

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的...

  • iOS容易循环引用的三种场景(转)

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的...

  • ios安全释放

    [obj release]:release操作后,obj对象的引用计数会减1,如果引用计数变为0,则obj对象会被...

  • OC的安全释放

    什么是安全释放?在对象调用release方法后把指针置为nil,即为安全释放,不置为nil,即为不安全释放。在MR...

  • 0x004 理解iOS weak对象释放后置为nil原理

    理解iOS weak对象释放后置为nil原理 1、弱引用对象释放的浏览与普通对象释放流程基本一样,区别在于清除散列...

  • 循环引用的浅谈

    简介 ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期...

  • 深入 Autorelease

    Autorelease 制是 iOS 提供延迟释放对象的一种机制,放弃对象所有权,但又不想对象会给立即释放.这个时...

  • Autorelease Pool

    自动释放池是iOS中的内存回收机制,能够延迟对象的释放。当池中的对象超出作用域后并不会立即被释放,等待自动释放池销...

网友评论

      本文标题:iOS对象的安全释放

      本文链接:https://www.haomeiwen.com/subject/jygrhftx.html