您的位置:首页 > 其它

深度解析什么是ARC

2015-01-25 23:04 309 查看
ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。

简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。

下面通过两段代码来看看使用ARC前后的变化;

第一段代码:

@interface NewObject: NSObject {

NSString *name;
}
- (id)initWithName:(NSString *)newName;
@end

@implementationNewObject

-(void)initWithName:(NSString *)newName{
self = [super init];
if (self) {
name = [newName retain];
}
return self;
}

- (void)dealloc
{
[name release];
[super dealloc];
}
@end
第二段代码:
@interface NewObject: NSObject {

NSString *name;
}
- (id)initWithName:(NSString *)name;
@end

@implementation NewObject

-(void)initWithName:(NSString *)newName{
self = [super init];
if (self) {
name = newName;
}
return self;
}

我们之前使用Objective-C中内存管理规则时,往往采用下面的准则

生成对象时,使用autorelease

对象代入时,先autorelease后再retain

对象在函数中返回时,使用return [[object retain] autorelease];

而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。

使用ARC有什么好处呢?

看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了

代码的总量变少了,看上去清爽了不少,也节省了劳动力

代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性

不好的地方有以下两点

记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期

一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关

ARC的基本准则是:

retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用

dealloc虽然可以被重载,但是不能调用[super dealloc]

由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: