iPhone没有提供垃圾收集机制。它依赖于一个引用计数的内存管理系统。这意味着开发人员必须控制何时创建对象、保留对象和从内存中释放对象。如果使用太多的内存,iPhone会警告应用程序委托和UIViewController。委托收到applicationDidReceiveMemoryWarning:回调,视图控制器收到didReceiveMemoryWarning。如果继续使用太多内存,iPhone将终止你的应用程序,使你的用户回到SpringBoard。正如苹果公司反复指出的那样,这也许不是你希望用户得到的用户体验,所以苹果公司拒绝接受你的应用程序进入App Store。
你必须在程序中小心地管理内存,在低内存的情况下释放内存。导致低内存的原因通常有两个:一是内存泄漏,即分配了不能被访问或重用的内存块;二是一次存储了太多的数据。
说明 除了保留和释放外,Objective-C还提供自动释放内存管理。将自动释放发送到一个对象(通常在该对象创建时),意味着希望它在将来某个时候自动被处理。请求对象的方法可以马上使用自动释放的对象,在当前运行的循环结束时处理对象,或者保留该对象,供将来使用。第3章将更详细地讨论内存管理。
2.6.1 泄漏
在Objective-C中,每个对象在创建时都带有一个基于整数的保留计数。只要那个保留计数大于或等于1,对象就不会被释放。开发人员需要实现一定的策略,确保在不再使用对象时将其释放。
使用alloc、new或copy创建的每个对象一开始的保留值都为1。如果发送一条retain消息到对象,则对象的保留计数加1。如果向对象发送release消息,则保留计数减1。(将对象赋给一个已保留属性也会使保留计数增加。)如果失去了对一个对象的访问权限,而又没有将保留计数减至0,那么就造成了泄漏,也就是说,分配出去的内存无法收回。下面的代码导致一个数组的内存被泄漏: