美文网首页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