在介绍内存管理之前,先来简单了解一下内存中的堆和栈。
栈
当程序执行某个方法时,会从栈中分配一块内存空间,这块内存空间称为帧。帧负责保存程序在方法内声明的变量的值。
当运行main函数时,它的帧会被保存在栈的底部,当main函数调用其他函数时,这个函数的帧会压入栈的顶部。被调用的函数还可以调用其他方法。当被调用的方法结束时,程序会将其帧从栈顶弹出并释放。
堆
堆是内存中的另一块区域,和栈不同,堆包含了大量无序的活动对象,需要用指针来保存这些对象在堆中地址。
由于iOS设备的内存非常有限,当不要某些对象时,就要将其释放掉,将其所占的内存归还给堆,使这块内存能够被重新使用。
注意,如果只分配内存而不释放,设备内存将会很快被消耗完。如果释放了正在使用的内存,那么程序将会出错。可见内存管理是多么的重要。
ARC与内存管理
编写iOS应用时,只需要通过ARC管理内存,也就是自动引用计数。
指针变量与对象所有权
指针变量暗含了对其所指向的对象的所有权。
如果某个对象没有拥有者,就应该将其释放掉。
如果某个对象有一个或多个拥有者,就必须不能释放。
强引用循环
如果两个或多个对象之间相互引用,对象将不会被释放,造成内存泄露。