本文共 1181 字,大约阅读时间需要 3 分钟。
重要提示: 此文档不再更新。有关 Apple SDK 的最新信息,请访问。
应用程序内存管理是在程序运行时分配内存,使用它并在完成后释放内存的过程。编写良好的程序使用尽可能少的内存。在 Objective-C 中,它还可以被看作是在许多数据和代码之间分配有限内存资源的所有权的一种方式。完成本指南后,您将掌握管理应用程序内存所需的知识,方法是明确管理对象的生命周期,并在不再需要时释放它们。
虽然内存管理通常被视为单个对象的级别,但您的目标实际上是管理对象图。您希望确保内存中没有比实际需要的对象更多的对象。
Objective-C 提供了两种应用程序内存管理方法。
在本指南中描述的方法(称为 “手动保留 - 释放” 或 MRR)中,您通过跟踪您拥有的对象来明确管理内存。这是使用一个称为引用计数的模型实现的,Foundation 类 与运行时环境一起提供。
在自动引用计数或 ARC 中,系统使用与 MRR 相同的引用计数系统,但它在编译时为您插入适当的内存管理方法调用。强烈建议您将 ARC 用于新项目。如果您使用 ARC,通常不需要理解本文档中描述的底层实现,尽管在某些情况下它可能会有所帮助。有关 ARC 的更多信息,请参阅。
内存管理不正确导致两种主要问题:
释放或覆盖仍在使用的数据
这会导致内存损坏,并且通常会导致应用程序崩溃,甚至导致用户数据损坏。
不释放不再使用的数据会导致内存泄漏
内存泄漏是未释放已分配内存的地方,即使它从未再次使用过。泄漏会导致应用程序使用不断增加的内存量,从而导致系统性能下降或应用程序被终止。
但是,从引用计数的角度考虑内存管理通常会适得其反,因为您倾向于根据实现细节而不是实际目标来考虑内存管理。相反,您应该从对象所有权和对象图的角度考虑内存管理。
Cocoa 使用简单的命名约定来指示您拥有方法返回的对象的时间。
请参阅。
虽然基本策略很简单,但您可以采取一些实际步骤来简化内存管理,并帮助确保您的程序保持可靠和健壮,同时最大限度地减少其资源需求。
请参阅。
自动释放池块提供了一种机制,您可以通过该机制向对象发送 “延迟” release
消息。这在您想要放弃对象的所有权但希望避免立即释放它的可能性(例如从方法返回对象时)的情况下非常有用。有时您可能会使用自己的自动释放池块。
请参阅。
要在编译时识别代码问题,可以使用 Xcode 中内置的 Clang Static Analyzer。
如果仍然出现内存管理问题,您可以使用其他工具和技术来识别和诊断问题。
许多工具和技术都在技术说明 TN2239,进行了描述,特别是使用NSZombie
帮助查找过度释放的对象。
您可以使用 Instruments 跟踪引用计数事件并查找内存泄漏。请参阅。
转载地址:http://oqhwn.baihongyu.com/