您的位置:首页 > 移动开发 > IOS开发

浅析ARC

2016-04-20 11:32 260 查看

简介

ARC是Automatic Reference Counting(自动引用计数器)的简称.

ARC是ios5.0引入的新特性,完全消除手动管理内存的繁琐,编译器会自动在适合的代码里面插入适当的retain,release,autorelease的语句.我们不要再担心内存管理,因为编译器帮我们做了这一切.

ARC是编译器的特性,并非运行时的特性,也不是其他编程语言中的垃圾回收器.因此自动管理和手动管理内存其实一样的,但是自动管理更加快速,因为编译器执行某些优化.

编译器会为“拥有的”每一个对象插入相应的release语句。如果对象的所有权修饰符是__strong,那么它就是被拥有的。如果在某个方法内创建了一个对象,前端编译器会在方法末尾自动插入release语句以销毁它。而类拥有的对象(实例变量/属性)会在dealloc方法内被释放。事实上,你并不需要写dealloc方法或调用父类的dealloc方法,ARC会自动帮你完成一切。此外,由编译器生成的代码甚至会比你自己写的release语句的性能还要好,因为编辑器可以作出一些假设。在ARC中,没有类可以覆盖release方法,也没有调用它的必要。ARC会通过直接使用objc_release来优化调用过程。而对于retain也是同样的方法。ARC会调用objc_retain来取代保留消息。

ARC优化器负责移除多余的retain和release语句,确保生成的代码运行速度高于手动引用计数的代码。

原理

ARC的规则就是只要对象没有强指针引用,就会被释放掉,换而言之 只要还有一个强引用指针变量指向对象,那么这个对象就会存在内存中.弱指针指向的对象,会被自动变成空指针(nil指针),从而不会引发野指针错误.

在项目中设置是否使用ARC



注意点

在ARC下,dealloc可以重写,但是不能调用[super dealloc]

outlet的控件属性都是weak修饰,因为他们已经被父控件强引用.

ARC只对OC对象的进行内存管理,对于CoreFundation的api使用,他的对象所有权没有移交给OC对象管理,都需要手动去释放.

strong 相当于 MRC(Manual Reference Counting) 的 retain,大多修饰OC对象,

weak 相当于 MRC 的 assign 但是 在指向的对象被销毁的时候,指针会被设置成0,修饰代理

assign 如果是Objective C 对象,在没有特殊处理的时候,相当于strong,常用于修饰内置类型

在ARC下,一个block内引用一个对象的实例变量后,self会被retain,所以极易造成strong reference cycle,可以通过__weak指针来避免这种情形,__weak类型指针在所指向对象销毁后会自动置为nil,ARC不会为__weak指针retain(__weak id safeSelf = self)

__bridge : Objective-C 和 Core Foundation 之间的转换, 拥有权不变.

__bridge_retained : 从 Objective-C 到 Core Foundation 的转换,由程序员负责把得到的 CFxxxRef 销毁

__bridge_transfer : 从 Core Foundation 到 Objective-C 的转换,由ARC负责把得到的 id 销毁

Core Foundation类型的对象仍然可以用CFRetain,CFRelease这些方法

不能再使用NSAllocateObject和NSDeallocateObject对象

不能以new为开头给一个属性命名

不能在C结构体中使用对象指针,如果有类似功能可以创建一个Objective-C类来管理这些对象

不能再使用NSAutoreleasePool对象,ARC提供了@autoreleasepool块来代替它,这样更有效率

不能使用内存存储区(不能再使用NSZone)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息