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
(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] 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
强弱指针:
(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