第一章 自动引用计数

本系列知识点均来自 《Objective-C 高级编程 IOS与OS X多线程和内存管理》,仅作重要知识点摘录。

引用计数式的内存管理方式:

  • 自己生成的对象,自己所持有。(alloc/new/copy/mutableCopy)
    • id obj = [[NSObject alloc] init];
  • 非自己生成的对象,自己也能持有。(retain)
    • id obj = [NSMutableArray array];
      • 使用[NSMutableArray array]方法取得对象的存在,但自己不持有对象,实现原理如下:
        • ... id obj = [[NSObject alloc] init];//自己持有对象
        • [obj autorelease]; //取得对象的存在,但自己不持有对象
        • return obj;
      • autorelease:对象超出指定生存范围时能够自动并正确地释放。(注册到autoreleasepool中-> pool 结束时自动调用release)。
    • [obj retain];
  • 不再需要自己持有的对象时释放。自己持有的对象,一旦不再需要,持有者有义务释放该对象。(release)
    • id obj =  [[NSObject alloc] init];
    • [obj release];
  • 非自己持有的对象无法是伐。 (deadlloc)

引用计数式的实现:

  • 在Objective-C的对象中存在有引用计数这一整数数值。
  • 调用alloc/retain 方法后,引用计数器加1。
  • 调用release后,引用计数器减1。
  • 引用计数值为0时,调用dealloc方法废弃对象。
  • 苹果大概采用散列表(引用计数表)来管理引用计数。

autorelease:

  • 看上去很像ARC,但实际上它更类似于C语言中的局部变量的特性。






在Cocoa 框架中,相当于程序主循环的NSRunLoop或者其他程序可运行的地方,对NSAutoreleasePool对象进行生成、持有和废弃处理。因此,应用程序开发者不一定非得使用NSAutoreleasePool对象来进行开发工作。

但在大量产生autorelease 对象时,只要不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此会产生内存不足问题。在此情况下,有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值