[Objective-c 基础 - 3.2] ARC

A.ARC的基本原理

1.ARC的判断原则:只有没有强指针指向对象,就会立即释放对象
注意,在以下情况,会立即回收内存:
(1)指针超出作用域
     {
Person *p1 = [[Personalloc] init];
p1.name = @"p1";
NSLog(@"");
}// 超出p1作用域,回收p1指向的空间 NSLog(@"");
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)指针指向别的对象
     Person *p1 = [[Personalloc] init];
NSLog(@"");
p1.name = @"p1";
NSLog(@"");
p1 = [[Personalloc] init]; // p1指向了别的对象,原来指向的内存空间被释放
NSLog(@"");
 
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
     Person *p1 = [[Personalloc] init];
p1.name = @"p1";
NSLog(@"");
p1 = nil; // p1被置为nil,原来指向的内存空间被释放
NSLog(@"");
 
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———————
 @classDog;
@interfacePerson :NSObject
@property(nonatomic,strong)Dog*dog;
@end
 
——————Dog.h————————
 @classPerson;
@interfaceDog :NSObject
@property(nonatomic,weak)Person*person;
@end
 
对比非ARC的解决方案:一方使用retain,另一方使用assign
 
上一篇:Vue.js学习笔记(1)


下一篇:Tomcat+redis+nginx配置