美文网首页iOS Developer
GeekBand-OC中的ARC

GeekBand-OC中的ARC

作者: swuzjb | 来源:发表于2016-03-08 17:36 被阅读72次

自动引用计数(Automatic Reference Counting)是Objective-C默认的内存管理机制,其针对堆上的对象,由编译器自动生成操作引用计数的指令(retain或release),来管理对象的创建与释放。

哪些对象受ARC管理

  • OC对象指针
  • Block指针
  • 使用attribute((NSObject))定义的typedef

哪些对象不受ARC管理

  • 值类型
  • 使用其他方式分配的堆对象,如malloc
  • 非内存资源

ARC的操作规范或过程

  1. 新创建(new alloc copy)一个引用类型对象,引用计数为1
    NSObject obj = [NSObject alloc];
  2. 如下操作会使引用计数加1(即retain操作):
    //1.将对引用赋值给其它变量、常量、属性、实例常量
    NSObject obj2 = obj;
    //2.将对象加入集合中
    NSSet set;
    [set addObject:obj];
    //3.将对象传递给函数参数,或者返回值
    void draw(BLNPoint *p){
    NSLog(@"[%ld, %ld]",(long)p.x, (long)p.y)
    }
  3. 对象引用计数减1——release操作:
    //1.将变量赋值为nil或其它值
    obj = nil;
    //2.属性或实例变量所在的对象被释放、或赋为其它值
    //3.参数或局部变量离开函数
    //4.将对象从集合中删除
    [array removeObjectAtIndex:0];
  4. 引用计数变为0时,内存自动被释放。

自动释放池

当引用计数变为0时,对象会触发release事件,使内存立即释放。但是如果频繁对对象进行release,可能会造成琐碎的内存管理负担。autorelease可以将release的调用延迟到自动释放池被释放时。

  void poolDemo(){
       @autoreleasepool {
            for (int i = 0; i < 10; i++) {
              __unused  BLNRectangle *rect = [[BLNRectangle alloc]init];
        }
      }
   }

什么时候需要手工管理自动释放池

  • 编写的程序不基于UI框架,如命令行程序。
  • 再循环中创建大量临时对象,需要更早的释放,避免临时对象聚集导致内存峰值过大
  • 在主线程之外创建新的线程,在新线程开始执行处,需要创建自己的Autorelease Pool。
  • 可以嵌套使用Autorelease Pool

相关文章

网友评论

    本文标题:GeekBand-OC中的ARC

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