介绍
无论编写任何程序,您都需要确保能够有效和高效地管理资源。程序内存就是这些资源中的一种。在Objective-C程序中,您必须确保您所创建的对象,在不再需要它们的时候被销毁。
在一个复杂的系统中,可能很难精确地确定从何时起您不再需要某个对象。Cocoa定义了一些有助于使这一抉择变得更加容易的规则和原则。
重要:在Mac OS X v10.5及更高的版本中,您可以通过采用垃圾回收机制来使用自动内存管理。这一部分内容在垃圾回收编程指南中向您介绍。iOS不提供垃圾回收机制。
如果您想要了解在引用计数环境中创建,复制,维护和销毁对象的相关技术及对象所有权的规则,您应该阅读本文档。
注意:如果您想要针对Mac OS X v10.5或更高的版本开发新项目,在一般情况下您应该使用垃圾回收机制,除非您有充足的理由要使用本文档描述的技术。
本文档不会向您阐述分配和初始化对象以及实现初始化方法这样的细节。这些内容会在Objective-C编程语言的“分配和初始化对象”部分中进行讨论。
本文档包含以下几部分:
§ “内存管理规则”总结了对象所有权和销毁的规则。
§ “对象的所有权和销毁”描述了基本的对象所有权策略。
§ “实用内存管理”以实用性的角度透视内存管理。
§ “自动释放池”描述了自动释放池—一种延迟回收的机制—在Cocoa程序中的用法。
§ “存取方法”向您介绍如何实现存取方法。
§ “实现对象复制”讨论有关对象复制的问题,比如如何决定是执行深拷贝还是浅拷贝,在您自己的子类中如何实现对象的复制。
§ “Cocoa 中 Core Foundation 对象的内存管理”介绍了Cocoa代码中Core Foundation对象的内存管理技术及使用指南。
§ “Nib 对象的内存管理”讨论了与nib文件相关的内存管理的问题。
内存管理规则
本文总结了Objective-C中内存管理的规则。
以下是基本规则:
§ 您只能释放或自动释放您所拥有的对象。
§ 如果您使用名字以“alloc”或“new”开头或名字中包含“copy”的方法(例如alloc,newObject或mutableCopy)创建了一个对象,则您会获得该对象的所有权;或者如果您向一个对象发送了一条retain消息,则您也会获得该对象的所有权。
§ 您可以使用释放release或自动释放autorelease来释放一个对象的所有权。自动释放autorelease的意思是“将会发送释放release消息”(要了解究竟何时发送,请参考“自动释放池”)。
下面的规则是基本规则的衍生,或者是用于处理特殊边界情况的规则:
§ 作为基本规则的推论,如果您需要将接收到的对象存储为某个实例变量的属性,您必须保留或复制该对象。(对于弱引用来说并不是这样,详见“对象的弱引用”,但这种情况一般是很罕见的。)通常,您应该将这部分工作交给存取方法(参考“存取方法”)来处理。
§ 被接收的对象通常要保证在接收它的方法中仍然有效,并且该方法也可以将对象安全地返回给它的调用者。例外的情况包括多线程应用程序和一些“分布式对象”环境,然而,此时您还必须注意自己是否修改了您用来接收其它对象的对象(见“共享对象的有效性”)。在必要的时候,将保留retain与释放release或自动释放autorelease组合使用,可以防止对象因为消息的正常的边界效应而失效。
“对象的所有权和销毁”讨论了这些规则背后的推理过程。
重要:Core Foundation对象也有类似的内存管理规则(参考Core Foundation内存管理编程指南)。但是,Cocoa和Core Foundation的命名规范是不同的。特别地,Core Foundation的“Core Foundation的内存管理编程指南”中的创建规则”并不适用于返回Objective-C对象的方法。例如,在下面的代码片段中,您无需负责释放myInstance的所有权:
MyClass *myInstance = [MyClass createInstance]; |