IOS 学习笔记14 内存管理(3)有效的内存管理 后半部分
现在搞iphone开发,一直不是很懂object-c的内存管理机制,看到apple的官方文档写的不错而又没有找到翻译的文章。于是自己在学习它的过程中就顺便把它翻译了,自己的英语不是太好,文字组织能力那就更菜了,读的蹩脚之处还望大家指出,我好在以后的翻译过程中好好改正。第一次翻译,欢迎拍砖,可不要把我拍死了呀!!!
文章中带有LPSTUDY的字样表明是我个人的理解,可能会有不对的地方,敬请指教。
文章原文链接地址:
- http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1
不要使用dealloc管理稀缺资源
你不应该使用dealloc方法去管理像文件描述符,网络连接以及缓存之类的稀缺资源。特别是,你不应该去设计类想当然的认为dealloc将会在你认为的地方触发。dealloc的触发可能由于bug或者程序的崩溃被延迟或者规避掉。
相反,如果你有一个类的实例管理稀缺资源,那么你应该设计你的程序去告诉实例变量在适当的时候去清理资源,然后再去调用dealloc来释放实例变量。如果dealloc没有被调用,你就不会遭受比较严重的问题。
当你在dealloc方法中去管理资源时,问题可能就会出现。例如:
1. 对象图销毁的顺利依赖
对象图销毁机制内在是没有顺利,虽然你可能期望有一个特定的顺序,但通常这是不可靠的。如果一个对象不合适宜的落入了自动释放池中,对象的销毁顺序可能会改变,这会导致意想不到的问题
2. 没有回收稀缺资源
内存泄露的问题需要被解决,但是它们通常并不立刻引发致命的问题。如果一个稀缺资源没有在你想让它释放的时候释放掉,那么你可能遇到严重的问题。例如当你的程序用光了文件描述符,用户就不能保存数据了。
3. 清理逻辑在错误的线程中被执行
如果一个对象在一个错误的时间被放入了自动释放池中,它可能会被释放掉而不会管它碰巧是在哪一个线程池中。这可能是致命的,因为这个对象本改只被另一个线程访问。
LPSTUDY:
说实话,这一段读起来有一点拗口,太理论化了。我的理解是:当你管理稀缺资源的时候,不要在dealloc中做。比如你想在dealloc去释放文件描述符,但是可能由于程序的bug原因,dealloc没有被执行,也就是说这个文件描述符没有被释放。如果这个dealloc需要被执行多次,也就有很多你想释放的文件描述符没有被释放掉。这样很明显是错误的。当然上面说的有三种dealloc引起的问题,我仅仅是举了第二种例子。总的来说:不要用dealloc管理稀缺资源,换句话说,不要太相信dealloc的执行。
收集类拥有(retain)它们包含的对象
当你向一个收集类(例如数组,词典或者集合)添加了一个元素,那么这个收集类就拥有了这个元素。当你调用收集类的remove方法,或者此收集类自身被释放的时候,这个收集类释放元素的所有权。因此,如果你想创建一个数组,你可以采用以下方式:
NSMutableArray *array = <#Get a mutable array#>; |
NSUInteger i; |
// ... |
for (i = 0; i < 10; i++) { |
NSNumber *convenienceNumber = [NSNumber numberWithInteger:i]; |
[array addObject:convenienceNumber]; |
} |
上面的这种情况没有调用alloc,因此也没有必要调用release。你也不需要调用retain方法,因为array已经做了。
NSMutableArray *array = <#Get a mutable array#>; |
NSUInteger i; |
// ... |
for (i = 0; i < 10; i++) { |
NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger: i]; |
[array addObject:allocedNumber]; |
[allocedNumber release]; |
} |
上面的这种你调用了alloc方法,故而在addobject之后,你需要调用release方法。在addobject中,array已经对allocedNumber调用了retain操作。
如果你想更好的理解上面的机制,那么请你站在收集类设计者的角度上来看待它。因为你想确保你的收集类不依赖于外部传入进来的元素是否在以后的某一个时刻被释放了,于是你在元素传入进来的时候调用了retain操作。如果它们被移除了,你为了平衡添加的时候的retain,于是调用了release操作。在收集类的dealloc方法中,你应该对所有剩下的元素调用release方法。
拥有策略是通过引用计数实现的。
拥有机制通过引用计数实现,每一个对象有一个引用计数
· 当你创建了一个对象,它的引用计数是1
· 当你对此对象发送retain消息,它的引用计数增1
· 当你发送release消息,引用计数减1
当你发送autorelease消息,它的引用计数会在未来的某一个时候减1
· 如果一个对象的引用计数为0,它会被释放掉
重要:
你不应该去显式的观测对象的引用计数值,它的结果可能不正确,这主要是因为系统的框架可能会在你不知情的情况下调用了retain操作。在调试内存管理问题的时候,你应该总是去确保你的代码严格遵守了对象的拥有规则。
IOS 学习笔记14 内存管理(3)有效的内存管理 后半部分相关推荐
- iOS学习笔记(1)— UIView 渲染和内容管理
iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口. ...
- IOS学习笔记03---C语言概述
IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述 qq交流群:创梦技术交流群:251572072 创梦网络赚钱群:2483 ...
- 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
[转] C#学习笔记14--Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计 .NET Framework 命名空 ...
- PyTorch学习笔记(六)——Sequential类、参数管理与GPU
系列文章\text{\bf 系列文章}系列文章 PyTorch学习笔记(一)--Tensor的基础语法 PyTorch学习笔记(二)--自动微分 PyTorch学习笔记(三)--Dataset和Dat ...
- 华为HCIA-datacom 学习笔记14——WLAN概述
华为HCIA-datacom 学习笔记14--WLAN概述 1.WLAN(无线局域网) 通过无线技术构造的无线局域网络.WLAN广义上是指以无线电波.激光.红外线等无线信号代替有线局域网中的部分或全部 ...
- OpenCV for Ios 学习笔记(4)-标记检测1
本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...
- IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...
IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- node.js学习笔记14—微型社交网站
node.js学习笔记14-微型社交网站 1.功能分析 微博是以用户为中心,因此需要有注册和登录功能. 微博最核心的功能是信息的发表,这个功能包括许多方面,包括:数据库访问,前端显示等. 一个完整的微 ...
- Linux学习笔记14
Linux学习笔记14 Linux学习笔记14 DNS服务搭建 基本介绍 使用bind搭建dns服务 增加一个域名zone 配置DNS转发 配置主从 测试主从同步 后续课程 DNS服务搭建 基本介绍 ...
最新文章
- 中国顶尖的技术社区们在一个群里,会聊什么…
- 使用Spring Security 资源服务器来保护Spring Cloud 微服务
- C# JArray与JObject 的使用
- 【已解决】[Error] reference to ‘min‘ is ambiguous
- google+stackoverflow_哪些开发问题最让程序员“头秃”?我们分析了Stack Overflow的11000个问题...
- c++ 输出二进制_Python入门3print格式化输出的几种方法
- 【模板】快速排序(洛谷-P1177)
- 不良事件总结怎么写_护理不良事件总结分析.doc
- 我对敏捷价值观和原则的理解 --待续
- 如何测试聊天机器人的 10 个最佳实践
- python提取图片中的文字并生成word文档
- APK修改神器:插桩工具 DexInjector
- Redis报错Java.net.UnknownHostException的解决办法
- EBCDIC 与 GBK 的字符编码及其转换(转)
- 水星mw150us linux驱动下载,水星MW150US驱动
- 【C语言】将十进制数转化为二进制并输出
- DPDK和VPP地址池
- 你的电脑遇到问题,需要重新启动的解决思路
- Cocos Creator苹果应用商城上架指南
- 纯CSS+HTML绘制小猪佩奇---泥腿子前端出品