---------------------- ASP.Net+Unity开发、.Net培训、IOS开发.期待与您交流! ----------------------
虽然,在前面发表过一篇OC的内存管理的学习。但是内存管理在程序中的地位确实相当重要。特别是Xcode5后,默认的就是使用ARC。因此,有必要好好学学到底什么是ARC以及ARC该怎么用。
ARC不是垃圾回收
Objective-C 2.0引入了自动内存管理机制,也叫做垃圾回收。对于已经创建和使用的对象,当你忘记清理时,系统会自动识别哪些对象仍在使用,哪些对象可以回收。有了垃圾回收,就不必担心内存管理的问题了。但是,不要高兴的太早,在IOS中是无法使用垃圾回收的。好吧,这是为什么呢?因为你无法知道什么时候会进行垃圾回收。垃圾回收机制对移动设备的可用性产生非常不利的影响。因为移动设备比电脑更私人化,资源更少。如果我们在打电话的时候系统突然进行垃圾回收而卡住了。那真是太不爽了。没关系,苹果公司还给了我们另一大利器。那就是ARC(automatic reference counting)。
ARC的工作原理
ARC就像我们请的私人管家,我们只要向平常那样分配使用对象,编译器会自动帮你插入retain和release语句,不需要你亲自动手。比方说,当你采用了ARC代码只需如下这样写:NSObject *obj = [[NSObject alloc] init];
// do some stuff
OK。ARC会自动将代码变成下面这样:
NSObject *obj = [[NSObject alloc] init];
// do some stuff
[obj release]; // **Added by ARC**
好吧,就是这么贴心。其实也没什么复杂的。使用了ARC之后,并不是不需要retain、release了。只不过是编译器自动帮你加上的。当你运行程序的时候,系统可不会区分到底是你写的,还是编译器帮你自动加上的。
ARC的规则
1.关于Alloc和Init
创建对象的方法跟以前一样,但一定不能调用retain/release/autorelease/retainCount。也不能通过selector偷偷地调用它们: 禁止使用@selector(retain)和@selector(release)。
2.dealloc方法
ARC会自动帮你调用dealloc方法。因此不要你自己来调用。不过,如果你需要释放实例变量额外的资源,你还是可以重写dealloc方法。但是,就不需要[super dealloc]了。因为ARC会帮你调用。
3.声明的属性
在ARC之前,我们是用@property指令中的assign/retain/copy参数来告诉编译器,如何管理这些属性的内存。用了ARC之后,就不要这些属性了,改用weak/strong这两个参数。
4.C结构中的对象指针
同样禁止使用。文档里建议不要把它们放在结构了,改放到类里去。否则ARC就不认识它们了。可能会出现一些移植上的问题。
5.以@autoreleasepool代替NSAutoReleasePool
不能再使用NSAutoReleasePool对象,而要改用@autoreleasepool{}块。
还有一些比较高级的属性,就先不探讨了。
ARC限定符--声明的属性
强引用
强引用是对某对象的引用,并且能阻止它被回收。换句话说,强引用创建了一个所有关系。在ARC之前,我们这么写:
// Non-ARC Compliant Declaration
@property(retain) NSObject *obj;
在ARC下,我们需要这么写,以确保当前实例获得被引用对象的所有权(主人不被回收,它也不能被回收)。
// ARC Compliant Declaration
@property(strong) NSObject *obj;
弱引用
弱引用是对某对象的引用,但不能阻止它被回收。换句话说,弱引用并不会创建所有关系。在ARC之前,我们这么写:
// Non-ARC Compliant Declaration
@property(assign) NSObject *parentObj;
在ARC下,我们需要这么写,以确保当前实例没有获得被引用对象的所有权(一般来说,子对象不应该拥有父对象,这时可以用弱引用)。
// ARC Compliant Declaration
@property(weak) NSObject *parentObj;
好了,关于ARC,暂时就学习这么多。
---------------------- ASP.Net+Unity开发、IOS开发、.Net培训、期待与您交流! ----------------------