1.简介
ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切。
在ARC之前,我们是手动管理内存(MRC),即,创建一个对象后,在不使用这个对象的时候,需要将这个对象手动释放掉。
注意:ARC 是编译器特性,而不是 iOS 运行时特性,也不是类似于其它语言中的垃圾收集器。ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。
2.原理
ARC 的规则非常简单:只要还有一个强引用指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的。
2.1、.h和.m文件的变化说明
对于.h头文件,主要是将属性定义由retain变为strong
@property (retain, nonatomic)
变为
@property (strong, nonatomic)
2.2、IBOutlet
在ARC中,所有IBOutlet属性都推荐使用weak,这些view对象已经属于View Controller的view,不需要再次定义为strong。因此,这些定义为weak的IBOutlet属性都不需要在IBOutlet中设置为nil。
2.3、property属性
strong : 该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者,等同于"retain"
weak : 该属性对应 __weak 关键字,与 __weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被释放之后,对象引用将被自动赋值nil,记住IBOutlet应该使用weak
copy : 和之前的copy一样,复制一个对象并创建strong关联
assign : 对象不能使用assign,但原始类型(BOOL、int、float)仍然可以使用
3.ARC小结
1.有了ARC我们的代码可以清晰很多,你不再需要考虑什么时候retain或release对象。唯一需要考虑的是对象之间的关联,也就是哪个对象拥有哪个对象?
2.ARC也有一些限制:
1> 首先ARC只能工作于Objective-C对象,如果应用使用了Core Foundation或malloc()/free(),此时还是需要你来手动管理内存
2> 此外ARC还有其它一些更为严格的语言规则,以确保ARC能够正常地工作
3.虽然ARC管理了retain和release,但并不表示你完全不需要关心内存管理的问题。因为strong指针会保持对象的生命,某些情况下你仍然需要手动设置这些指针为nil,否则可能导致应用内存不足。无论何时你创建一个新对象时,都需要考虑谁拥有该对象,以及这个对象需要存活多久。
4.ARC还能很好地结合C++使用,这对游戏开发是非常有帮助的。对于iOS 4 ARC有一点点限制(不支持weak指针),但也没太大关系。
4.ARC使用注意
1.不能直接调用dealloc方法,不能调用retain,release,autorelease,retainCount方法,包括@selector(retain)的方式也不行
2.可以用dealloc方法来管理一些资源,但不能用来释放实例变量,也不能在dealloc方法里面去掉[super 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)
9.不能以new为开头给一个属性命名
10.声明IBOutlet时一般应当使用weak,除了对StoryBoard这样nib中间的顶层对象要用strong
11.weak相当于老版本的assign,strong相当于retain。
网友评论