黑马程序员_Objective-C中的ARC学习总结

本文详细介绍了Objective-C中的自动内存管理机制ARC,包括其工作原理、规则及应用,强调了在iOS开发中使用ARC的重要性以及如何正确地理解和运用ARC来避免常见的内存管理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- 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培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值