没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
iOS 高级内存管理编程指南
译者:张立明 baccc@sina.com
原稿为:苹果公司《Advanced Memory Management Programming Guide》 2011-9-28 版
目录
1 关于内存管理 .......................................................................................................................................1
1.1 概述 ...........................................................................................................................................1
1.2 防止内存泄露的最佳实践........................................................................................................2
1.3 使用分析工具来调试内存问题................................................................................................3
2 内存管理策略 .......................................................................................................................................4
2.1 基本内存管理规则....................................................................................................................4
2.2 延时 release—使用 autorelease..........................................................................................5
2.3 通过引用(Reference)来返回的对象,你没有所有权......................................................6
2.4 实现对象的 dealloc.................................................................................................................6
3 内存管理实战 .......................................................................................................................................8
3.1 使用访问方法(Accessor Method)使得内存管理更加容易..............................................8
3.2 使用访问方法(get set)来设置 property 属性的值........................................................9
3.3 不要在初始化的方法中,或者 dealloc 方法中使用访问方法(get set) ......................9
3.4 使用弱引用来避免所有权的死锁..........................................................................................10
3.5 避免你正在使用的对象被 dealloc....................................................................................... 11
3.6 不要使用 dealloc 来管理关键系统资源..............................................................................12
3.7 Collection 容器拥有其包容的对象的所有权.....................................................................13
3.8 所有权策略通过引用计数来实现..........................................................................................14
4 使用 Autorelease 池 .........................................................................................................................15
4.1 关于 Autorelease 池..............................................................................................................15
4.2 使用本地 Autorelease 池来减少内存占用峰值..................................................................16
4.3 Autorelease 池和线程...........................................................................................................17
4.4 Autorelease 池的作用域(Scope)和嵌套.........................................................................18
4.5 内存垃圾回收 .........................................................................................................................18
iOS 高级内存管理编程指南
第 1 页
1 关于内存管理
应用程序的内存管理是一个在程序运行时进行内存分配,使用内存、结束时释放内存的过程。
书写良好的程序,会尽可能少占用内存。在 Objectiv-C 中,这个过程也是一个在很多片代码或者
数据中传播有限内存资源的“所有权”(Ownership)的方式。读完本指南,你将可以“显式地”管
理对象的生命周期,并在不用的时候释放他们。
内存管理通常被认为是针对单个的对象进行的,但实际上我们的任务是管理“对象图”(Object
Graph),你需要确保除了你真的需要的对象之外,内存中没有其它的对象。
1.1 概述
Objective-C 提供了三种内存管理方式:
1. 本文中将要讲述的一种方式,称为“手工持有-释放”(Manual Retain-Release)或 MRR。
你通过跟踪你所拥有的对象来“显式地”管理内存。这种方式采用了一种称为“引用计数”
的模型。该模型由基础类 NSObject 和运行时(Runtime Environment)共同提供。
2. 自动引用计数(Automatic Reference Counting),或 ARC,的方式。系统采用和 MRR 相
同的引用计数系统,但是在编译时(Compile-time)插入了内存管理的方法。对于新的工
程项目,强烈建议使用 ARC 方式,这样你不需要理解本文所述的底层实现。不过,个别情
况下,你会受益于对这些底层实现的理解。更多关于 ARC 的讲述,请参看 Transitioning
iOS 高级内存管理编程指南
第 2 页
To ARC Release Notes。
3. 垃圾回收的方式。系统自动跟踪对象跟对象之间的引用关系。对于没有引用的对象,自动
进行回收。这种机制和前面说的 MRR 和 ARC 都不同,且只能在 Mac OS 下使用,iOS 下是
不行的。更多关于垃圾回收机制的内容,请参看 Garbage Collection Programming Guide。
如果你正准备写 iOS 代码,你必须用显式的内存管理(也就是本文的主题)。如果你想写
库函数(Library Routine)、插件(Plug-in)、或者共享代码(Shared Code)(运行于“有”
或者“没有”垃圾回收的进程中),你将使用本文中的内存管理技术来写代码。
1.2 防止内存泄露的最佳实践
错误的内存管理往往包括两类:
1. 释放(free)或者覆盖(over-write)正在使用中的数据。
造成内存异常,导致应用程序崩溃,甚至导致数据损坏。
2. 不用的数据却不释放,从而导致内存泄露。
内存泄露,就是有内存分配但是不释放它,哪怕这块内存已经不用了。泄露,导致你的应
用程序占用越来越多的内存,并导致整体性能的下降,或者在 iOS 平台上导致应用终止。
如果你总是考虑内存管理的实现细节,而不是你实际的管理目标,那么你会感觉到从“引用计
数”的角度理解内存管理实际是极其困难的。所以,你真正应该考虑的是对象的“所有权”
(Ownership)以及对象图(Object Graph)。
当一个方法所返回的对象,其所有权属于你的时候, Cocoa 用一种非常直接的命名规范来告
诉你。请参看 内存管理策略
尽管最基础的策略也是最直接的,有一些有效的做法可以让内存管理更加容易,从而帮助你实
现程序的稳定性和健壮性,从而使其占用更少的资源。请参看 内存管理实战
自动释放池(Autorelease Pool)使得你可以用一种不同的方式来发送 release 消息。当你想
放弃对一个对象的所有权,但又不想让这个所有权的释放立即生效(比如,你在方法中要返回这个
对象),这种机制就很有用了。有几种情况你应该需要使用自动释放池。 请参看 使用 Autorelease
池
iOS 高级内存管理编程指南
第 3 页
1.3 使用分析工具来调试内存问题
为了发现编译时的问题,可以使用 Xcode 自带的 Clang Static Ananlyzer。
如果内存管理问题依然存在,还有其他的工具和技术可以帮助你分析问题。
这些工具和技术在技术文章 TN2239, iOS Debugging Magic 中描述。更确切地说,是使用
NSZombie 来发现 release 过多的对象。
你还可以使用 Instruments 来跟踪引用计数事件,并寻找内存泄露。参看 Viewing and
Analyzing Trace Data.
剩余20页未读,继续阅读
baccc
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页