A.ARC的基本原理
1.ARC的判断原则:只有没有强指针指向对象,就会立即释放对象
注意,在以下情况,会立即回收内存:
(1)指针超出作用域
1 { 2 Person *p1 = [[Personalloc] init]; 3 p1.name = @"p1"; 4 NSLog(@"1"); 5 }// 超出p1作用域,回收p1指向的空间 6 7 NSLog(@"2");
out:
2014-11-21 00:14:59.980 01-autorelease基本概念[4282:263265] 1
2014-11-21 00:14:59.981 01-autorelease基本概念[4282:263265] Person - p1被回收了
2014-11-21 00:14:59.981 01-autorelease基本概念[4282:263265] 2
2014-11-21 00:14:59.981 01-autorelease基本概念[4282:263265] Person - p1被回收了
2014-11-21 00:14:59.981 01-autorelease基本概念[4282:263265] 2
(2)指针指向别的对象
1 Person *p1 = [[Personalloc] init]; 2 NSLog(@"1"); 3 p1.name = @"p1"; 4 NSLog(@"2"); 5 p1 = [[Personalloc] init]; // p1指向了别的对象,原来指向的内存空间被释放 6 NSLog(@"3");
out:
2014-11-21 00:10:52.263 01-autorelease基本概念[4248:261439] 1
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] 2
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] Person - p1被回收了
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] 3
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] 2
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] Person - p1被回收了
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] 3
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] Person - p2被回收了
(3)指针置nil
1 Person *p1 = [[Personalloc] init]; 2 p1.name = @"p1"; 3 NSLog(@"1"); 4 p1 = nil; // p1被置为nil,原来指向的内存空间被释放 5 NSLog(@"2");
out:
2014-11-21 00:12:49.289 01-autorelease基本概念[4266:262528] 1
2014-11-21 00:12:49.291 01-autorelease基本概念[4266:262528] Person - p1被回收了
2014-11-21 00:12:49.291 01-autorelease基本概念[4266:262528] 2
2014-11-21 00:12:49.291 01-autorelease基本概念[4266:262528] Person - p1被回收了
2014-11-21 00:12:49.291 01-autorelease基本概念[4266:262528] 2
强弱指针:
(1)强指针:使用_strong修饰, 默认情况下,所有指针都是强指针
(2)弱指针:使用_weak修饰
2.启动了ARC之后,@property属性不能使用retain了,retain用strong代替(不会报错,效果weak等同assign, strong等同retain)
@property(nonatomic,strong)Dog*dog;
有strong和weak两种指针类型可以选择
3.ARC的特点
(1)不允许调用release、retain、retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc],其实不重写其成员对象也会自动被释放
(3)@property参数
a.strong:成员变量是强指针,(适用于OC对象类型)
b.weak:成员变量是弱指针,(适用于OC对象类型)
c.assign:适用于非OC对象类型
—》以前的retain改为用strong
B.XCode的ARC转换
1.重构转换
Edit -> Refactor -> Convert to ARC for Objective c
自动消除掉函数、dealloc中的release代码
2.手动指定不需要使用ARC的代码文件
项目 -> Build Phase -> 双击代码文件 -> 加入参数 “-fno-objc-arc”
参数:
(1)-fno-objc-arc:禁用ARC
(2)-f-objc-arc:开启ARC
C.循环引用
互相使用strong引用的对象,不能被释放
解决:其中一方使用weak引用,一方使用strong引用
——————Person.h———————
1 @classDog; 2 @interfacePerson :NSObject 3 @property(nonatomic,strong)Dog*dog; 4 @end
——————Dog.h————————
1 @classPerson; 2 @interfaceDog :NSObject 3 @property(nonatomic,weak)Person*person; 4 @end
对比非ARC的解决方案:一方使用retain,另一方使用assign