首先,先不谈ARC,先上一张图,弄清楚iOS下内存管理的基本原理:
这就是手动内存管理的原理,通过对对象应用的计数来判断何时(计数为0时)销毁对象,现在ARC自动为你做了这一切,当然,ARC是在编译的时候自动在目标代码里面恰当的地方加了一些retain, release, 和autorelease语句而已。所以,如果使用ARC来进行内存管理,则可以把关注点更多地放在代码逻辑等方面,而不用牵绊于内存地释放等问题了。下面谈谈应用ARC的一些规则:
1、关于ARC的适用范围:只能在iOS4和iOS5上使用,如果使用了weak references,就只能在iOS5上使用了。
2、Apple推荐在所有的新工程中使用ARC来进行内存管理,针对老的应用,XCode4.2也提供了一个工具来进行转换(Edit-Refactor-Convert to Objective-ARC)。转换的规则包括:
(1)去掉所有的retain、release、autorelease
(2)把 NSAutoReleasePool替换为@autoreleasepool {}块
(3)把@property(assign)变为@property(weak)
3、使用ARC的若干强制性规定
(1)不能显式地调用dealloc方法,不能实现或调用retain, release, retainCount或者autorelease方法。当然,包括使用@selector(retain)这样的方式来调用也不行。
(2)可以自己实现一个dealloc方法来管理一些资源,但不不能用来释放实例变量,注意自定义dealloc方法式不要去调用[super dealloc],即父类的dealloc方法,否则会引起编译错误。在ARC下,对父类的dealloc同样有编译器来自动完成。
(3)对于Core Foundation类型的对象来说(基本类型),仍然可以使用CFRetain, CFRelease这些方法
(4)不能够再使用NSAllocateObject和NSDeallocateObject对象
(5)不能都在C结构体中使用对象指针,如果要实现类似的功能,可以创建一个Objective-C类来管理这些对象。
(6)在id和void *之间没有简便的转换方法,同样的,在Objective-C对象和Core Foundation类型之间的转换都需要使用编译器指定的转换函数。
(7)不能再使用NSAutoreleasePool对象了,ARC提供了@autoreleasepool块来替代它,这会更加有效率。
(8)不能使用内存存储区了,即不能再使用NSZone,这早已是被Objective-C的运行时抛弃的东西
(9)不能以new为开头来给一个property命名
(10)声明outlet时,一般都应当使用weak,除了对StoryBoard Segue这样nib中间中的顶层对象,就要用strong了。
4、对工程中的单个文件指定不使用arc的方法:在targets的build phases选项下Compile Sources下选择要不使用arc编译的文件,双击它,输入-fno-obj-arc即可,如下图: