ARC了解

来源:互联网 发布:淘宝双11购物券怎么用 编辑:程序博客网 时间:2024/06/06 05:04

ARC是自iOS5开始加的新特性,iOS程序猿的福音

ARC的全称是AutomaticReferenceCounting(自动引用计数)

ARC的实现细节

  • 编译器会自动在适当的地方插入适当的retainreleaseautorelease语句
  • 也就是说,编译器会自动生成内存管理的代码,不用程序猿手动编写

如果是手动管理内存,可以简称MRC(ManualReferenceCounting)

ARC与其他语言的垃圾回收机制不同。ARC:编译器特性;垃圾回收运行时特性

ARC的注意点

  • ARC是编译器特性,而不是运行时特性
  • ARC不是其它语言中的垃圾回收,有着本质区别

ARC的优点

  • 完全消除了手动管理内存的烦琐,让程序猿更加专注于app的业务
  • 基本上能够避免内存泄露
  • 有时还能更加快速,因为编译器还可以执行某些优化

ARC的判断原则

  • 只要还有一个强指针变量指向对象,对象就会保持在内存
  • **注意:当使用ARC的时候,忘记引用计数器,判断标准变了。

强指针

  • 默认所有指针变量都是指针
  • __strong修饰的指针

弱指针

  • __weak修饰的指针
  • // 1.案例

            __strong Person *p1 = [[Personalloc]init];

           

            __strong Person *p2 = p1;

           

            p1 = nil;

            //insert code here...

           NSLog(@"Hello, World!");

            p2 = nil;

           

           NSLog(@"hello");

    // 2.案例

            __strong Person *p1 = [[Personalloc]init];

           

            __weak Person *p2 = p1;

           

            p1 = nil;

            //insert code here...

           NSLog(@"Hello, World!");

            p2 = nil;

           

           NSLog(@"hello");

    // 3.案例:PersonDog属性

           // 使用ARC后,可以重写dealloc方法,但是不能在里面调用[superdealloc]了。

            Person *p1 = [[Personalloc]init];

           

            Dog *dog = [[Dogalloc]init];

           

            p1.dog = dog;

           

            dog =nil;

            //insert code here...

           NSLog(@"Hello, World!");

            p1 = nil;

           

           NSLog(@"hello");
  • ARC使用细节
  • 不能调用releaseretainautoreleaseretainCount

    可以重写dealloc,但是不能调用[superdealloc]

    ARC中的@property

    • strong: 用于OC对象,相当于MRC中的retain
    • weak: 用于OC对象,相当于MRC中的assign
    • assign:用于基本数据类型,MRC中的assign一样
    • copy: 一般用于NSString,MRC中的copy一样
    • ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak

0 0