OC 中的自动引用计数 ARC

1、什么是 ARC

  • Automatic Reference Counting ,自动引用计数,ARC
  • 系统自动的帮我们计算对象的引用计数器的值

2、ARC 的基本原则

  • ARC 是编译器机制。在编译器编译代码的时候,会在合适的位置插入 retain、release、autorelease 代码。不需要程序员手动的写入 retain、release、autorelease

3、ARC 机制下,对象何时被释放?

  • 本质:对象的引用计数器为 0 的时候,自动释放。
  • 表象:只要没有强指针指向这个对象,这个对象就会被回收。

4、强指针与弱指针

1> 强指针:默认情况下,我们声明一个指针,这个指针就是一个强指针。也可以使用 __strong 来显示的声明这是一个强指针。

 Person *p1;    //这是一个强指针。默认情况下声明的指针都是强指针
 __strong Person  *p2;   //这也是一个强指针。使用 __strong 来显示的声明强指针

2> 弱指针:使用 __weak 标识的指针叫做弱指针。

1、无论是强指针还是弱指针,都是指针。都可以用来存储地址,都可以通过指针来访问对象的成员。
2、唯一的区别就是在 ARC 模式下,它们用来作为对象回收的基准。(如果没有强指针指向这个对象,那么这个对象就会被自动释放)

3、对象被回收的的案例

1> 当指向对象的所有强指针被回收的时候,对象就会被立即回收

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p1 = [Person new];  //强指针.默认情况下,声明的指针都是强指针.
        Person *p2 = p1;  //p2也是强指针, p1 和 p2 都指向Person对象
        NSLog(@"--------");
    }  //当执行到这里的时候,p1指针被回收, p2指针也被回收了,那么 Person 对象就没有任何强指针指向它了,对象就在这被回收
    return 0;
}

2> 将所有指向对象的强指针赋值为 nil 的时候,对象就会被立即回收

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p1 = [Person new];  //强指针.默认情况下,声明的指针都是强指针.
        p1 = nil; //此时将p1赋值为 nil,说明p1指针不再指向Person对象了.Person 对象没有被任何指针所指向,因此Person对象在这里被释放
        NSLog(@"--------");
    }
    return 0;
}

3> 创建对象,不能用一个弱指针来存储这个对象的指针。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //1.创建一个对象,将这个对象的地址赋值给一个弱指针
        //2.此时刚创建出来的对象没有被一个强指针指向,这个对象就会被释放
        __weak Person *p1 = [Person new];  //直接报警告 
        NSLog(@"--------");
    }
    return 0;
}

在 ARC 机制下,当对象被回收的时候,原来指向这个对象的弱指针会被自动设置为 nil

4、总结

1> 默认情况下,Xcode开启 ARC 机制。
2> ARC 机制下,不允许调用 retain、release、retainCount、autorelease 方法
3> 在 dealloc 方法中,不允许调用 [super dealloc]
4> 指向对象的强指针被回收、指向对象的强指针被赋值为 nil,都叫做对象没有强指针指向
5> 在 ARC 机制下,@property 参数不能使用 retain。strong 和 weak 都可以使用,如果 @property 什么都不写的话,默认就是 strong。
6> strong 和 weak 都应用在属性是 OC 对象的时候,属性不是 OC 对象的时候使用 assign,assign 在 ARC 和 MRC 下都可以使用。

你可能感兴趣的:(ARC自动引用计数,ios,开发语言)