ARC(Automatic Reference Counting)
:自动引用计数,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,启用ARC后,开发者不需要担心内存管理,编译器会为你处理这一切*(注意ARC是编译器特性,而不是iOS运行时特性,更不是其他语言中的垃圾收集器)
MRC(Manual Reference Counting)
手动管理内存
Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。
alloc:为一个新对象分配内存,并且它的引用计数为1。调用alloc方法,你便有对新对象的所有权
copy:制造一个对象的副本(克隆体),该副本的引用计数为1,调用者具有对副本的所有权
retain:使对象的引用计数加1,并且获得对象的所有权
release:使对象的引用计数减1,并且放弃对象的所有权
autorelease:使对象的引用计数在未来的某个时候减1,并且在那个时候放弃对象的所有
ARC机制判断
iOS5以后,创建项目默认的都是ARC
ARC机制下有几个明显的标志:
不允许调用对象的 release方法
不允许调用 autorelease方法
再重写父类的dealloc方法时,不能再调用 [super dealloc];
ARC快速使用
int main(int argc, const char * argv[]) {
// 不用写release, main函数执行完毕后p会被自动释放
Person *p = [[Person alloc] init];
return 0;
}
ARC下@property参数
strong : 用于OC对象, 相当于MRC中的retain(使引用计数+1)(该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者)
weak : 用于OC对象, 相当于MRC中的assign(引用计数不变)(用于对其他NSObject和其子类,就是指针类型,weak 用来修饰弱引用的属性,但是不同的是当对象被释放以后,对象自动赋值为nil;并且,delegate 和 Outlet 苹果推荐用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained)
assign: 简单赋值,不更改索引计数(Reference Counting)(对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等))。
copy: 建立一个索引计数为1的对象,然后释放旧对象(开辟新的内存地址)(对NSString)
nonatomic关键字:
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,
造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,
那么nonatomic是一个非常好的选择。
iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC)
总结:ARC 完全消除了手动管理内存的烦琐, 让程序猿更加专注于app的业务
基本上能够避免内存泄露,有时还能更加快速,因为编译器还可以执行某些优化
网友评论