内存管理是管理对象声明周期并在不再需要它们的时候释放它们的编程规则。管理对象内存是一个性能问题;如果应用程序不释放不需要的对象,则其内存占用会增加,性能会受到影响。Cocoa 应用程序中的内存管理不使用垃圾收集,而是基于引用计数模型。当你创建或复制对象时,其保留计数为1。此后,其他对象可能表示对你的对象的所有权,这将增加其保留计数。对象的所有者也可以放弃其在该对象中的所有权,这将减少保留计数。当保留计数为零时,对象将被释放(销毁)。 为了帮助你进行内存管理,Objective-C为你提供了必须按照一组规则使用的方法和机制。
注意:在 OS X 中,你可以显示管理内存,也可以使用 Objective-C 的垃圾收集功能。垃圾收集在 iOS 中不可用。
内存管理规则
内存管理规则,有时也称为所有权策略,帮助你在 Objective-C 代码中显示地管理内存。
- 你拥有通过为其分配内存或复制它而创建的任何对象。
相关方法:alloc, allocWithZone:, copy, copyWithZone:, mutableCopy, mutableCopyWithZone: - 如果你不是一个对象的创建者,但希望确保这个对象保留在内存中供你使用,则可以对它表示所有权。
相关方法:retain - 如果你拥有一个对象,不管是通过创建它还是你对它表示了所有权,当你不再需要它的时候都要负责释放它。
相关方法:release, autorelease - 相反,如果你不是有某个对象的创建者,并且对该对象没有所有权,你就不能释放它。
如果你从程序中的其他地方接收到一个对象,通常保证它在接收它的方法或函数中保持有效。如果你希望它在该范围之外保持有效,你应该保留或复制它。如果试图释放一个已经被销毁的对象,则程序会崩溃。
内存管理方面
以下概念对于理解和正确管理对象内存至关重要:
- 自动释放池。向对象发送 autorealase 将标记该对象推迟释放,当你希望释放的对象在当前作用域之外持久存在时,这很有用。自动释放对象将其放入自动释放池 (NSAutoreleasePool 的实例),该实例是为任意程序范围创建的。当程序执行退出该范围时,池中的对象将被释放。
- 解除分配。当一个对象的保留计数下降到零时,运行时会在该对象的类销毁该对象之前调用该对象类的 dealloc 方法。类实现此方法以释放对象所拥有的任何资源,包括由其实例变量指向的对象。
- 工厂方法。许多框架类定义类方法,为了方便起见,可以创建类的对象。这些返回的对象不能保证在接收方法的范围之外是有效的。
网友评论