关闭

Automatic Reference Counting(ARC)特性学习(iOS5新特性学习之五)

414人阅读 评论(0) 收藏 举报
 

Automatic Reference Counting(ARC)特性学习(iOS5新特性学习之五)

分类: iOS5新特性学习 内存管理 670人阅读 评论(1) 收藏 举报

首先,先不谈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即可,如下图:


参考文章:http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html#//apple_ref/doc/uid/TP40011226

                    http://clang.llvm.org/docs/AutomaticReferenceCounting.html

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1879760次
    • 积分:19681
    • 等级:
    • 排名:第421名
    • 原创:9篇
    • 转载:1263篇
    • 译文:24篇
    • 评论:26条
    最新评论