objective-c中ARC机制


一、ARC介绍
Apple的文档里是这么定义ARC的:
“自动引用计数(ARC)是一个编译器级的功能,它能简化Cocoa应用中对象生命周期管理(内存管理)的流程。”
ARC并不是垃圾收集,而且,引用计数也没有消失,只是变成自动而已。

二、ARC使用原理
当采用ARC后,代码只要这样写:
NSObject *obj = [[NSObject alloc] init];
// do some stuff

ARC会自动将它变成:
NSObject *obj = [[NSObject alloc] init];
// do some stuff
[obj release]; // **Added by ARC**

三、在工程中开启ARC
如果想开启ARC,只要在工程的Build Settings中设置ARC为YES。



四、ARC新规则

1. 对象的Alloc/Init

创建对象的方法跟以前一样,但你一定不能调用retain/release/autorelease/retainCount。也不能通过selector偷偷地调用它们: 禁止使用@selector(retain)和@selector(release)。

2. dealloc方法

ARC为自动为你调用,一定不能直接调用dealloc。不过,如果你需要释放实例变量以外的资源,还是可以创建自定义的dealloc方法。但在这个方法里,不要调用[super dealloc]。因为ARC会帮你调。


3. 声明的属性

在ARC之前,我们是用@property指令中的assign/retain/copy参数来告诉编译器,如何管理这些属性的内存。用了ARC之后,这些参数就作废了,改用weak/strong这两个参数。


4. ARC准则:只要没有强指针(strong)指向对象,就会释放对象。


五、ARC限定符,声明的属性(strong、 weak)

1.强引用(指针)是对某对象的引用,并且能阻止它被回收。换句话说,强引用创建了一个所有关系。(默认情况下,所有指针都是强指针。)

在ARC之前,我们这么写:

// Non-ARC Compliant Declaration
@property(retain) NSObject *obj;

在ARC下,我们需要这么写,以确保当前实例获得被引用对象的所有权(主人不被回收,它也不能被回收)。

// ARC Compliant Declaration
@property(strong) NSObject *obj;
2. 引用是对某对象的引用,但不能阻止它被回收。(只要弱指针指向对象不存在,弱指针就会清空)

换句话说,弱引用并不会创建所有关系。在ARC之前,我们这么写:

// Non-ARC Compliant Declaration
@property(assign) NSObject *parentObj;

在ARC下,我们需要这么写,以确保当前实例没有获得被引用对象的所有权(一般来说,子对象不应该拥有父对象,这时可以用弱引用)。

// ARC Compliant Declaration
@property(weak) NSObject *parentObj;



  • __strong: 默认限定符,不需要显式指定。表示任何用alloc/init创建的对象在当前范围的生命期内得以保留。“当前范围”是指变量声明语句所在的两个大括号之间(方法、循环、块,等等)。
【只要没有强指针指向对象,就会释放对象】
  • __weak: 表示对象可以随时被摧毁。只有当它被其它对象强引用时才有用。__weak变量在摧毁时,被设为nil。__weak Person *p2 = p;

六、移植到ARC

1、打开不兼容ARC的工程,进入Edit > Refactor > Convert to Objective-C ARC。


2、选择需要转换的构建目标和文件(在后续步骤排除不需要转换的文件)


3、运行预查,按下一步。


4、检查一下工具建议的修改,并选择是否要排除某个文件。然后按下保存。


七、引入不兼容的ARC代码

我们可以让一部分文件用ARC,另一部分文件不用。

步骤如下:

  1. 在Xcode的工程树上,点击你自己的工程
  2. 点击Target
  3. 选择Build Phases标签
  4. 展开Compile Sources
  5. 选择需要排除在ARC外的文件
  6. 按下回车
  7. 输入-fno-objc-arc
  8. 再按下回车
  9. 现在,你选中的文件都有了-fno-objc-arc编译器标识,会被排除在ARC之外
八、循环引用时的解决方案

  1. 当两端循环引用时,解决方案(非ARC): 一端用retain, 一端用assign
  2. 当两端循环引用时,解决方案(ARC): 一端用strong,一端用weak



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值