ARC机制

什么是ARC

  • Automatic Reference Counting,自动引用计数. 即ARC.

    • 顾名思义:系统自动的帮助我们去计算对象的引用计数器的值,
  • 可以说是WWDC2011和iOS5引入的最大的变革和最激动人心的变化.

  • ARC是新的LLVM3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开着所憎恨的手动管理内存的麻烦.

  • 在程序中使用ARC非常简单,只需要像往常那样编写代码.

    • 只不过永远不要写retain、release、autorelease这三个关键字就好,这是ARC的最基本的原则.
      当ARC开启时, 编译器会自动的在合适的地方插入retain、release、autorelase代码.
  • 编译器自动为对象做引用计数. 而作为开发者,完全不需要担心编译器会做错(除非开发者自己错用了ARC).

  • 需要特别注意的是: ARC是编译器机制. 在编译器编译代码的时候,会在适时的位置加入retain、release和autorealse代码.

  • . ARC机制下,对象何时被释放

    • 只要没有强指针指向这个对象,这个对象就会立即回收.
  • 强指针与弱指针.

    • 强指针: 默认情况下,我们声明1个指针 这个指针就是1个强指针.

      • 我们也可以使用__strong来显示的声明这是1个强指针.

      • Person *p1; 这是1个强指针. 指针默认情况下都是1个强指针.

        • __strong Person *p2; 这也是1个强指针.使用__strong来显示的声明强指针.
  • 弱指针: 使用__weak标识的指针就叫做弱指针.

  • 无论是强指针还是弱指针,都是指针,都可以用来存储地址,这1点没有任何区别 。

  • 都可以通过这个指针访问对象的成员.
  • 唯一的区别就是在ARC模式下.他们用来作为回收对象的基准.

    • 如果1个对象没有任何强类型的指针指向这个对象的时候,对象就会被自动释放
  • 确认程序是否开启ARC机制.

    • 默认情况下,Xcode开启ARC机制.
    • ARC机制下,不允许调用retain、relase、retainCount、autorelease方法.
    • 在dealloc中 不允许[super dealloc];
int main(int argc, const char * argv[])
        {
            @autoreleasepool
            {
                Person *p1 = [Person new];//p1是1个强指针.
                //因为我们说过,每1个指针变量默认情况下都是1个强指针变量.
                NSLog(@"------");
            }//当执行到这里的时候.p1指针被回收,那么Person对象就没有任何
            //强指针指向它了. 对象就在这被回收.
            return 0;
     }
  • ARC下的单个对象的内存管理.

    • 当指向对象的所有的强指针被回收的时候,对象就会被立即回收.
int main(int argc, const char * argv[])
     {
         @autoreleasepool
         {
             Person *p1 = [Person new];//p1是1个强指针.
             Person *p2 = p1;//p2也是个强指针.p1和p2都指向Person对象.
             //因为我们说过,每1个指针变量默认情况下都是1个强指针变量.
             NSLog(@"------");
         }//当执行到这里的时候.p1指针被回收,p2指针也被回收.那么Person对象就没有任何
         //强指针指向它了. 对象就在这被回收.
         return 0;
     }
  • 将所有指向对象的强指针赋值为nil的时候.对象就会被立即回收.
int main(int argc, const char * argv[])
     {
         @autoreleasepool
         {
             Person *p1 = [Person new];//p1是1个强指针.
             //因为我们说过,每1个指针变量默认情况下都是1个强指针变量.

             p1 = nil;//当执行到这句话的时候.p1赋值为nil.
             //p1指针不再执行Person对象.
             //Person对象没有被任何的指针所指向,所以.Person对象在这里被释放.
             NSLog(@"------");
         }
         return 0;
     }
  • .最重要的1点:不能创建对象用1个弱指针存储这个对象的指针.
    • 这样的话,刚创建出来的对象,就没有任何强指针指向,创建出来就会被回收.
 int main(int argc, const char * argv[])
     {
            @autoreleasepool
            {
                //创建1个对象,将这个对象的地址赋值给1个弱指针
                //后果就是创建出来的这个对象没有被任何强指针指向.
                //刚创建出来就会被释放.
                __weak Person *p1 = [[Person alloc] init];
                
            }
            return 0;
     }

你可能感兴趣的:(对象)