ARC是自iOS5开始增加的新特性, 是iOS程序猿的福音
ARC的全称是AutomaticReferenceCounting(自动引用计数)
ARC的实现细节
-
编译器会自动在适当的地方插入适当的retain、release、autorelease语句
-
也就是说, 编译器会自动生成内存管理的代码,不用程序猿手动编写
如果是手动管理内存, 可以简称MRC (ManualReferenceCounting)
ARC与其他语言的”垃圾回收”机制不同。ARC:编译器特性;“垃圾回收”运行时特性
ARC的注意点
-
ARC是编译器特性,而不是运行时特性
-
ARC不是其它语言中的垃圾回收, 有着本质区别
ARC的优点
-
完全消除了手动管理内存的烦琐,让程序猿更加专注于app的业务
-
基本上能够避免内存泄露
-
有时还能更加快速,因为编译器还可以执行某些优化
ARC的判断原则
-
只要还有一个强指针变量指向对象,对象就会保持在内存中
-
**注意:当使用ARC的时候,忘记“引用计数器”,判断标准变了。
强指针
-
默认所有指针变量都是强指针
-
被__strong修饰的指针
弱指针
- 被__weak修饰的指针
-
// 1.案例
__strong Person *p1 = [[Person alloc] init];
__strong Person *p2 = p1;
p1 = nil;
// insert code here...
NSLog(@"Hello, World!");
p2 = nil;
NSLog(@"hello");
// 2.案例
__strong Person *p1 = [[Person alloc] init];
__weak Person *p2 = p1;
p1 = nil;
// insert code here...
NSLog(@"Hello, World!");
p2 = nil;
NSLog(@"hello");
// 3.案例:Person的Dog属性
// 使用ARC后,可以重写dealloc方法,但是不能在里面调用[super dealloc]了。
Person *p1 = [[Person alloc] init];
Dog *dog = [[Dog alloc] init];
p1.dog = dog;
dog = nil;
// insert code here...
NSLog(@"Hello, World!");
p1 = nil;
NSLog(@"hello"); -
ARC使用细节
-
不能调用release、retain、autorelease、retainCount
可以重写dealloc,但是不能调用[superdealloc]
ARC中的@property
- strong : 用于OC对象, 相当于MRC中的retain
- weak : 用于OC对象, 相当于MRC中的assign
- assign :用于基本数据类型, 跟MRC中的assign一样
- copy : 一般用于NSString, 跟MRC中的copy一样
- 在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。