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;
2> 弱指针:使用 __weak 标识的指针叫做弱指针。
1、无论是强指针还是弱指针,都是指针。都可以用来存储地址,都可以通过指针来访问对象的成员。 2、唯一的区别就是在 ARC 模式下,它们用来作为对象回收的基准。(如果没有强指针指向这个对象,那么这个对象就会被自动释放)
3、对象被回收的的案例
1> 当指向对象的所有强指针被回收的时候,对象就会被立即回收
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p1 = [Person new];
Person *p2 = p1;
NSLog(@"--------");
}
return 0;
}
2> 将所有指向对象的强指针赋值为 nil 的时候,对象就会被立即回收
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p1 = [Person new];
p1 = nil;
NSLog(@"--------");
}
return 0;
}
3> 创建对象,不能用一个弱指针来存储这个对象的指针。
int main(int argc, const char * argv[]) {
@autoreleasepool {
__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 下都可以使用。
|