A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


ARC是什么
ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。

变化点
通过一小段代码,我们看看使用ARC前后的变化点。
@interface NonARCObject : NSObject {    NSString *name;}-(id)initWithName:(NSString *)name;@end@implementation NonARCObject-(id)initWithName:(NSString *)newName {    self = [super init];    if (self) {        name = [newName retain];    }    return self;}-(void)dealloc {    [name release];    [Super dealloc];}@end@interface ARCObject : NSObject {    NSString *name;}-(id)initWithName:(NSString *)name;@end@implementation ARCObject-(id)initWithName:(NSString *)newName {    self = [super init];    if (self) {        name = newName;    }    return self;}@end我们之前使用Objective-C中内存管理规则时,往往采用下面的准则
  • 生成对象时,使用autorelease
  • 对象代入时,先autorelease后再retain
  • 对象在函数中返回时,使用return [[object retain] autorelease];
而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。
使用ARC的好处
使用ARC有什么好处呢?
  • 看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了
  • 代码的总量变少了,看上去清爽了不少,也节省了劳动力
  • 代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性
不好的地方
  • 记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期
  • 一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关
关于第二点,由于 XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有”Automatic Reference Counting Issue”的错误信息。

这个时候,可以将项目编译设置中的“Objectice-C Auto Reference Counteting”设为NO。如下所示。

如果只想对某个.m文件不适应ARC,可以只针对该类文件加上 -fno-objc-arc 编译FLAGS,如下图。

ARC基本规则
  • retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
  • dealloc虽然可以被重载,但是不能调用[super dealloc]
由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。
Objective-C对象
ObjectiveC中的对象,有强参照(Strong reference)和弱参照(Weak reference)之分,当需要保持其他对象的时候,需要retain以确保对象引用计数加1。对象的持有者(owner)只要存在,那么该对象的强参照就一直存在。
对象处理的基本规则是
  • 只要对象的持有者存在(对象被强参照),那么就可以使用该对象
  • 对象失去了持有者后,即被破弃
强参照 (Strong reference)

(s1)
firstName作为”natsu”字符串对象的最初持有者,是该NSString类型对象的Strong reference。
(s2)
这里将firstName代入到aName中,即aName也成为了@”natsu”字符串对象的持有者,对于该对象,aName也是Strong reference。
(s3)
这里,改变firstName的内容。生成新的字符串对象”maki”。这时候firstName成为”maki”的持有者,而@”natsu”的持有者只有aName。每个字符串对象都有各自的持有者,所以它们都在内存中都存在。
(s4)
追加新的变量otherName, 它将成为@”maki”对象的另一个持有者。即NSString类型对象的Strong reference。
(s5)
将otherName代入到aName,这时,aName将成为@”maki”字符串对象的持有者。而对象@”natsu”已经没有持有者了,该对象将被破弃。
弱参照 (Weak reference)
接下来我们来看看弱参照 (Weak reference) 的使用方式。

26 个回复

倒序浏览
好东西学习了
回复 使用道具 举报
joiezw 来自手机 中级黑马 2015-12-11 09:08:41
藤椅
还没学,准备今天看内存
回复 使用道具 举报
这个行业就不断学习的过程,新的技术出来一方面是给我们带来新奇的体验感受,另一方面是要求开发者不断是学习适应,做出的东西真的是足够便利吸引人。要学习的东西很多,大好基础,不断学习。
回复 使用道具 举报
这个行业就不断学习的过程,新的技术出来一方面是给我们带来新奇的体验感受,另一方面是要求开发者不断是学习适应,做出的东西真的是足够便利吸引人。要学习的东西很多,大好基础,不断学习。
回复 使用道具 举报
ARCs是用着方便,但是学好MRC对理解ARC很有帮助
回复 使用道具 举报
Jhon 中级黑马 2015-12-12 20:17:21
7#
谢谢分享!!!
回复 使用道具 举报
seonhiu 中级黑马 2015-12-12 21:14:13
8#
赞一个!
回复 使用道具 举报
chensc 金牌黑马 2015-12-13 12:10:54
9#
学习学习!
回复 使用道具 举报
qu29437 来自手机 中级黑马 2015-12-13 19:39:23
10#
不错好好学习天天向上
回复 使用道具 举报
chensc 金牌黑马 2015-12-14 20:54:20
11#
学习学习!
回复 使用道具 举报
MRC今天学的时候听迷糊了。准备好好研究一下。ARC用着挺方便,但是不知道原理我感觉也白搭
回复 使用道具 举报
chensc 金牌黑马 2015-12-16 20:57:26
13#
学习学习!
回复 使用道具 举报
厉害,学习了!
回复 使用道具 举报
不明觉厉!!!
回复 使用道具 举报
chensc 金牌黑马 2015-12-18 21:20:31
16#
学习学习!
回复 使用道具 举报
回复 使用道具 举报
qu29437 来自手机 中级黑马 2015-12-23 12:33:07
18#
加油好好学习天天向上
回复 使用道具 举报
好高端的样子  不过看不懂
回复 使用道具 举报
我想睡觉了. 每天好累
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马