黑马程序员技术交流社区

标题: ARC机制 [打印本页]

作者: 路默”    时间: 2014-5-9 23:36
标题: ARC机制

ARC 简介

ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。

自动引用计数(ARC),是一项为Objective - C程序在编译时提供自动内存管理的功能。ARC可以让你把注意力集中在你感兴趣的代码,对象图,和你的应用程序中的对象之间的关系,让你不必再花费精力在retain和release操作上。正如下图所示,ARC可以减少开发中的内存管理步骤,简化开发。

简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。

该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能,ARC支持Mac OS X v10.6/10.7 (64-bit applications) 上的Xcode 4.2,支持iOS4、iOS5。但是ARC在Mac OS X v10.6和iOS4上,不支持Weak references(弱引用)。

使用ARC必须遵守的新规则


为了正常运行,ARC引入了一些特有的新规则。新规则的用于提供一个完整可靠的内存管理模式;这些规则有些是用于更好的用户体验,另外一些则是用于简化你的编码,或让你不必再为内存管理操心。如果你违反了这些规则,在你编译的时候就会报错了,而不是当你编译成功,开始运行时出现一些bug。

1.不可以再显示调用dealloc、或实现调用retain、release、retainCount、autorelease这些方法。


2.很明显也不能使用@selector(retain), @selector(release),等等。


3.当你需要管理一些非实例变量的资源时,你可以实现一个dealloc方法。你不需要也不能去释放实例变量,

   但您可以调用[systemClassInstance setDelegate:nil]或不使用ARC编译的内存管理代码。


4. 在ARC下去自定义dealloc方法不需要调用 [super dealloc],(实际上如果你调用了 [super dealloc],编译器会报错)。

    super的调用是由编译器自动强制执行的。


5. CFRetain, CFRelease, 还有其他Core Foundation-style objects函数 (详见“Managing Toll-Free Bridging”)还是可以执行的。

6. 不能使用NSAllocateObject或NSDeallocateObject。


7. 使用alloc来创建对象,由ARC来管理对象运行时的释放。


8. 不能在C语言的结构体中使用对象指针。


9. 建议使用Objective-C的class来管理数据格式,来代替C语言的struct。


10.不能隐式转换 id和void *。


11.你必须告诉编译器转换的类型。当你需要在obj-C的对象和Core Foundation 类型之间转换时,你可以通过函数的参数来做。详见“Managing Toll-Free Bridging”。


12.不能使用NSAutoreleasePool对象。ARC提供了一个@autoreleasepool块来代替,这个块相比NSAutoreleasePool来说,具有更高的有效性。


13. 不能使用memory Zone。因为现在Objective-C运行时已经忽略NSZone了,所以没必要再使用NSZone了。


14.为了可以和手动内存管理(manual retain-release)的代码兼容,ARC提出了一些变量方法的命名规约。

15.你不能用“new”来做property的名字开头。


ARC引入的新的生命周期修饰符
ARC引入了一些新的生命周期修饰符和zeroing weak引用.。一个weak引用不会改变它所指向对象的生命周期。 一个zeroing weak引用会在它指向的对象被释放以后,自动赋为nil。

使用编译标识来开关ARC模式

你可以使用 -fobjc-arc来启用ARC。你也可以使用-fno-objc-arc来为某个你希望使用手动管理内存的文件来禁用ARC。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2