![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
6.2 内存管理
内存管理的核心工作就是及时清理回收不用的内存空间,以便高效地利用内存空间。在面向对象编程开发中,内存管理的核心就是管理对象的创建与释放。当一个对象要被创建时,在内存中分配相应的内存空间,而当一个对象不再被使用时,需要及时从内存中清除,释放空间。
1.引用计数(Reference Count)
引用计数是在Objective-C中用于管理对象生命周期的机制,这种机制可以很有效地管理对象的生命周期。当一个对象被创建时,它的引用计数为1。每当有新的指针指向这个对象时,这个对象的引用计数就加1。当某个指针不再指向这个对象时,该对象的引用计数减1。当该对象的引用计数为0时,该对象就被自动销毁,占用的内存被回收。
对于引用计数的理解,也可以用放风筝做个比喻。比如说风筝就是一个对象,最开始时,会有一个人拉着一根线不让风筝飞走,当再有人来时,会给这个风筝再加1根线,这时,这个风筝就有两根线牵着,其中任何一根线断掉,风筝都不会飞走,只有当两根线都断掉时,风筝才会飞走。引用计数也基本符合这个道理。
2.MRC(Manual Reference Counting)
MRC,即手工引用计数。在Xcode 4.2版本之前,对象的引用计数都需要程序员来手工管理,因此,程序员需要花费大量的精力来管理对象的创建与销毁,其中一个最基本的原则就是:谁创建谁销毁。
在MRC中,程序员需要手工管理对象的引用计数,在NSObject类中,有关引用计数有以下常用方法。
- 引用计数加一。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T157_18703.jpg?sign=1738901302-NL5ADHLdAMrB0pl3Q9KtMSjJ4AgJtzy0-0-1da98767358bac83cf80e7f41c4f2059)
- 引用计数减一。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T157_18705.jpg?sign=1738901302-3rill8KOCNKANjuIfO8NvuR3UIRgR3QY-0-9a8200d6f6111baa524e2e56e80a8608)
- 获取对象当前的引用计数。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T157_18707.jpg?sign=1738901302-0pKLMiDrN6wMGaI7udWbbbTBqfsDuOZb-0-5e5e2407528f05956e5defc84daa956f)
3.MRC测试
下面通过一个简单的示例代码验证在MRC模式下的内存管理模式。
- 新建一个命令行工具工程,如图6-11所示。
- 在TARGETS设置中,为main.m文件添加-fno-objc-arc编译标识,如图6-12所示。
- 在main.m文件,编写如下的代码。创建一个对象obj1;然后创建obj2,指向obj1;再释放obj2以及obj1,打印在不同时间点obj1的引用计数。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P158_18793.jpg?sign=1738901302-TRS9X7GwoIB8bryAXUW2HuJC99ZP3z8k-0-c63476682a844334b05ef57281b9d736)
图6-11 新建命令行工具工程
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P158_18796.jpg?sign=1738901302-wTPXVYeI5kW9uYuWSDOUEsxUzx4SUHeZ-0-778135e38a4a98bb28453c6968e7e630)
图6-12 添加-fno-objc-arc编译标识
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T158_18799.jpg?sign=1738901302-pPIqSd31Nu2oPH2NDsSzihBbxNGU6ryl-0-a41efe0987fbf77780dab9c7562ea493)
运行结果如图6-13所示。可以看到obj1的引用计数的变化过程。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P159_18838.jpg?sign=1738901302-KoDxeXfXQ5DtahhvwStLKOyUYhvBtGvR-0-a81a693675eaa3e02c2e3fe6c4e36525)
图6-13 运行结果
4.ARC(Automatic Reference Counting)
随着Xcode 4.2的版本发布,苹果引入了其中一个新特性就是自动引用计数(Automatic Reference Counting,ARC)。与MRC不同,自动引用计数模式中,对象的引用计数管理完全交由系统来管理,也就是说,在MRC中的retain/release操作都由系统自动完成了。程序员90%的情况下,不需要再去关心内存管理相关的事务,对象的释放完全交由系统来统一管理。目前ARC已经成为iOS程序开发的主流选择,这也是苹果公司所希望看到的。使用自动引用计数ARC可以避免程序员因为疏忽而造成的引用计数出错的隐患,不仅极大地简化了代码编写工作量,同时也减少了内存管理中存在的错误,如图6-14所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P159_18842.jpg?sign=1738901302-UN5LnX0oLTe7xO9FsJJcC4Y8de0Otc0U-0-6eba6d6d8e732e69ea9a796899cdf17b)
图6-14 ARC特性