引言(Introduction)
关于内存管理(About Memory Management)
应用程序的内存管理是程序在运行时分配内存的过程,运行它,使用完时将其释放。一个好的程序将使用尽可能小的内存。在Objective-C
中,它也可以被视为多个数据和代码分配有限内存资源的所有权。当您学习完本指南时,你将有拥有所需要的管理你应用程序内存的知识,如清楚地知道如何管理对象的生命周期,并在它们不再使用时释放掉。
虽然内存管理通常在考虑一个单独的对象的层次,但是你的目标实际上是管理对象的整个周期图表。你要确保在内存中没有不需要的对象。
一眼看去
Objective-C
提供了两种应用程序的内存管理方法。
- 在本指南中描述的方法,称为“手动保留释放”或
MRR
,您通过跟踪你的对象来明确地管理内存。这是用一个模型来实现,称为引用计数,结合运行时环境,由基础框架类NSObject
所提供。 - 自动引用计数,或者
ARC
,该系统使用相同的引用计数系统MRR,但它会在编译期为你插入适当的内存管理方法调用。强烈建议在新项目中使用ARC。如果您使用的是ARC
,通常不需要了解本文档中所描述的基本实现方法,尽管它可能在某些情况下是有用的。更多关于ARC
,参考过渡到ARC释放笔记
良好的做法防止内存相关的问题
有2种主要的问题会产生不正确的内存管理
释放或重写还仍在使用的数据
这会导致内存损坏,通常会导致应用程序崩溃,或更糟糕的是,用户的数据被损坏。
不再使用的数据未及时释放掉,导致内存泄漏
内存泄漏是指已分配的却未被释放掉的内存,即便它再也不会被使用。内存泄漏将导致您的应用程序内存占用量不断增加,这反过来可能导致系统的性能不佳,您的应用程序可能会被关闭。
从引用计数(ARC
)的角度来思考内存管理,往往适得其反,因为你倾向于考虑内存管理方面的实施细节,而不是你的实际目标。其实,你应该从对象所有权和对象图的角度来考虑内存管理。Cocoa
使用一个简单的命名规则来表示当你持有一个方法所返回的对象。
参考内存管理策略
基本策略看起来简单,然而有一些实用的步骤提供给,它们将使内存管理更容易,并帮助确保您的程序仍然是可靠和健壮的,同时,最大限度地减少所占用的资源。
参考实际的内存管理
自动释放池中提供了一种机制,你可以把一个对象的释放消息“推迟”。这是有用的情况下,你想放弃一个对象的所有权,但要避免它立刻释放(如你从一个方法返回一个对象时)。有些时候你可能会使用自己的自动释放池块。
参考使用自动释放池
使用分析工具来调试内存问题
查找代码在编译时的问题,你可以使用Xcode
内部的Clang
静态分析器。
很多工具和技术的阐述在技术文档TN2239中,而iOS调试魔法介绍关于使用NSZombie
找到”过度释放”对象。
- 如果内存管理问题仍然出现,有其他的工具和技术可以用来识别和诊断这些问题。
- 您可以使用
Instruments
来追踪引用计数事件,并查找内存泄漏。参考收集你应用程序的数据。