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 下都可以使用。