【译】苹果官方手册:高级内存管理编程手册1:关于内存管理-介绍
2016-07-23 本文已影响138人
hlwz5735
应用的内存管理是指在你的程序运行和使用时申请内存,并在使用完毕后释放内存的过程。好的程序会尽可能地减少对内存的占用。在Objective-C中,通过一些数据和代码分发有限的内存资源的拥有权是很常见的。当你完成了本教程后,你就会明白,你需要通过明确地管理对象的生存周期并在他们不再被需要的时候释放它们,来对你的应用进行内存管理。
尽管内存管理通常是在独立对象的层级被考虑的,但你的目标是明确地管理对象图(在面向对象编程中,一组的对象通过它们之间的关系——包括直接引用或一串间接引用组成的网络。这么一组对象就被叫做对象图)。你需要确保内存里不要留有你需要之外的对象。
惊鸿一瞥
Objective-C提供两种内存管理方法:
- 本教程介绍的方法,通常被叫做“手动保持释放”或“MRR”,需要你明确地通过跟踪对象状态来管理内存。实现的方法是使用是使用一种被叫做“引用计数”的方式,由基础类NSObject结合运行时环境来提供。
- 在自动引用计数,或被称作ARC(Automatic Reference Counting)中,系统使用和MRR一样的引用计数模式,但它是在编译期才将合适的内存管理方法调用插入到代码中。我们强烈推荐你在新的工程项目中使用ARC方法。当你在使用ARC的时候,就几乎没有必要理解本文档讨论的实现机制,尽管在某些场合下理解这些机制还是非常重要的。要想更多地了解ARC,请参考转换到ARC的使用要点。
避免内存管理方面的问题需要多次实践
有两种主要的问题会导致内存管理方便的错误:
- 释放或覆盖仍在使用中的数据
这将导致内存非法操作,并且通常会导致应用崩溃,或者,用户数据丢失。 - 不再使用的数据不释放,导致内存泄露
内存泄漏是指向操作系统申请的内存空间即使再也不会用到了,也不释放。内存泄漏会导致你的应用占用越来越多的内存空间,这样会影响在配置较差机器上的性能表现,或者直接导致应用被终止。
从引用计数的角度去考虑内存管理往往会适得其反,因为你会陷在内存管理实现的细节问题上,而不是真正的目的上。实际上,你应该从对象的依赖关系及对象图的角度去考虑内存管理的问题。
当你获得一个由函数返回的对象时,Cocoa使用一种直接的命名惯例来标明。
参考内存管理方法。
尽管基本办法直截了当,但你还是可以采用很多使用的步骤来简化内存管理,并且帮助确保你的程序的可靠性和健壮性,并较少配置需求。
参考内存管理实践。
自动释放池语法块提供了一种机制,凭借这种机制你可以给一个对象发送一个“延迟的”释放消息。在你准备放弃对一个对象的拥有权,但又想避免立即释放该对象时,这种机制非常有用(例如当你从一个方法中返回一个对象时)。你也许会想要使用你自己的自动释放池语法块。
参考使用自动释放池语法块。
使用分析工具解决内存问题
你可以使用Xcode内建的Clang Static Analyzer工具在代码的编译器就找出问题。
如果内存管理问题确实产生了,可以使用这些工具和技术来找出并诊断疑难问题。