一、ARC的判断准则
只要没有强指针指向对象,对象就会被释放。
代码示例:
Person *p = [[Person alloc] init]; p = nil;
代码解析:默认情况下,p是强指针。当p等于空时,就没有强指针指向Person对象,这时候编译器会自动将Person对象销毁。
二、指针分类
1.强指针:默认的情况下,所有的指针都是强指针,关键字strong
2.弱指针:_ _weak关键字修饰的指针
声明一个弱指针如下:
__weak Person *p;
ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作(nil指针)。
__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。
@property(nonatomic,strong)Dog *dog; // 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
如果换成是弱指针,则换成weak,不需要加__
三、ARC的特点总结
1.不允许调用release,retain,retainCount
2.不允许重写dealloc,但是不允许调用[super dealloc]
[email protected]的参数:
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
Assign:基本数据类型,直接赋值。(适用于非OC对象)
4.手动管理内存的retain,全部改为strong,其余不变
例如:@property (nonatomic, retain) Car *car;
改为:@property (nonatomic, strong) Car *car;
四、控制ARC功能的开关
1.点选当前project最上的设置文件
![]()
OC内存管理(ARC)
2.在右边的设置选项里找到ARC做出修改(找不到可以搜索ARC)
![]()
OC内存管理(ARC)
注意:
1)在ARC模式下,release 、retain 、retainCount 、autorelease 都是不能调用的。
2)在ARC模式下,不能使用[super dealloc];
~验证ARC回收对象机制
①若想在ARC重写dealloc中调用父类的dealloc,程序报错
②再次重写dealloc,通过打印语句验证ARC是否起作用![]()
OC内存管理(ARC) ③通过运行结果可知,ARC帮助我们管理了内存![]()
OC内存管理(ARC) ![]()
OC内存管理(ARC)
五、解决循环引用
1.ARC
一端用strong,一端用weak
Dog 端 : @property (nonatomic,strong) Person *person;
Person端:@propertor (nonatomic,weak) Dog *car
![]()
OC内存管理(ARC)
2.非ARC
一端用retain,一端用assign
Dog 端 : @property (nonatomic,retain) Person *person;
Person端:@propertor (nonatomic,assign) Dog *car
★注:字符串是特殊的对象,但不需要使用release手动释放,这种字符串对象默认就是autorelease的,不用额外的去管内存
参考:https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html