首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》3.2 堆

关灯直达底部

堆(heap)是指内存中的另一块区域,和栈是分开的。为这两类内存区域分别取名堆和栈,是为了能够形象地描述这两个概念。栈会按后进先出的规则保存一组帧,而堆则包含了大量无序的活动对象,需要通过指针来保存这些对象在堆中的地址。

当应用向某个类发送alloc消息时,系统会从堆中分配出一块内存,其大小足够存放相应对象的全部实例变量。以BNRItem对象为例,BNRItem对象包含5个实例变量,其中4个为指针变量(isa、_itemName、_serialNumber和_dateCreated),另一个为int变量(_valueInDollars)。因此,系统会为1个int变量和4个指针变量分配内存,其中指针变量保存其他对象在堆中的地址。

ios应用在启动和运行时会持续创建需要的对象,如果堆的空间是无限的,则可以随意创建所需的对象,并且在应用运行期间不用释放。

但是可供应用支配的堆空间是有限的,而且iOS设备的内存也非常有限。因此,当应用不再需要某些对象时,就要将其释放掉。这是非常重要的一步,因为释放对象后,可以将其占用的内存归还给堆,使之能够被重新使用。另外,也要绝对避免释放应用正在使用的对象。

ARC和内存管理

幸运的是,编写iOS应用时,并不需要记录对象是否应该保留或释放,而只需要通过ARC管理内存,也就是自动引用计数。本书中所有应用都会使用ARC。在Apple引入ARC之前,应用只能通过手动引用计数(manual reference counting)来管理内存。本章结尾部分会对手动引用计数做更多的介绍。

大多数情况下,可以依靠ARC来自动地完成应用的内存管理工作。但是,为了能够在需要的时候手动处理某些特殊的内存管理问题,理解其背后的工作原理也很重要。所以下面要进一步介绍“对象所有权”概念。