


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从 C+ 到 Objective-C(13):内存管理作者:DevBean日期: 2011 年 03 月 29 日发表评论(3)查看评论new 和 deleteObjective-C 中没有 new 和 delete 这两个关键字(new 可以看作是一个函数,也就是 alloc+init)。它们实际是被 alloc 和 release 所取代。引用计数内存管理是一个语言很重要的部分。在 C 和 C+ 中,内存块有一次分配,并且要有一次释放。这块内存区可以被任意多个指针指向,但只能被其中一个指针释放。Objective-C 则使用引用计数。对象知道自己被引用了多少次,这就像狗和狗链的关系。如果对象是一条狗,每个人都可以拿狗链拴住它。如果有人不想再管它了,只要丢掉他手中的狗链就可以了。只要还有一条狗链,狗就必须在那里;但是只要所有的狗链都没有了,那么此时狗就自由了。换做技术上的术语,新创建的对象的引用计数器被设置为 1。如果代码需要引用这个对象,就可以发送一个 retain 消息,让计数器加 1。当代码不需要的时候则发送一个 release 消息,让计数器减 1。对象可以接收任意多的 retain 和 release 消息,只要计数器的值是正的。当计数器成 0 时,析构函数 dealloc 将被自动调用。此时再次发送 release 给这个对象就是非法的了,将引发一个内存错误。这种技术并不同于 C+ STL 的 auto_ptr。Boost 库提供了一个类似的引用计数器,称为 shared_ptr,但这并不是标准库的一部分。alloc, copy, mutableCopy, retain, release明白了内存管理机制并不能很好的使用它。这一节的目的就是给出一些使用规则。这里先不解释 autorelease 关键字,因为它比较难理解。基本规则是,所有使用 alloc,mutablecopyWithZone: 或者是 retain 增加计数器的对象都要用 autorelease 释放。事实上,有三种方法可以增加引用计数器,也就意味着仅仅有有限种情况下才要使用 release 释放对象: 使用 alloc 显式实例化对象; 使用 copyWithZone: 或者 mutableCopyWithZone: 复制对象(不管这种克隆是不是伪克隆); 使用 retain。记住,默认情况下,给 nil 发送消息(例如 release)是合法的,不会引起任何后果。autorelease不一样的 autorelease前面我们强调了,所有使用 alloc,mutablecopyWithZone: 或者是 retain 增加计数器的对象都要用 autorelease 释放。事实上,这条规则不仅仅适用于 alloc、retain 和 release。有些函数虽然不是构造函数,但也用于创建对象,例如 C+ 的二元加运算符(obj3 operator+(obj1, obj2))。在 C+ 中,返回值可以在栈上,以便在离开作用域的时候可以自动销毁。但在 Objective-C 中不存在这种对象。函数使用 alloc 分配的对象,直到将其返回栈之前不能释放。下面的代码将解释这种情况:/ 第一个例子-(Point2D*) add:(Point2D*)p1 and:(Point2D*)p2 Point2D* result = Point2D alloc initWithX:(p1 getX + p2 getX) andY:(p1 getY + p2 getY); return result;/ 错误!这个函数使用了 alloc,所以它将对象的引用计数器加 1。/ 根据前面的说法,它应该被销毁。/ 但是这将引起内存泄露:calculator add:calculator add:p1 and:p2 and:p3;/ 第一个算式是匿名的,没有办法 release。所以引起内存泄露。/ 第二个例子-(Point2D*) add:(Point2D*)p1 and:(Point2D*)p2 return Point2D alloc initWithX:(p1 getX + p2 getX) andY:(p1 getY + p2 getY);/ 错误!这段代码实际上和上面的一样,/ 不同之处在于仅仅减少了一个中间变量。/ 第三个例子-(Point2D*) add:(Point2D*)p1 and:(Point2D*)p2 Point2D* result = Point2D alloc initWithX:(p1 getX + p2 getX) andY:(p1 getY + p2 getY); result release; return result;/ 错误!显然,这里仅仅是在对象创建出来之后立即销毁了。这个问题看起来很棘手。如果没有 autorelease 的确如此。简单地说,给一个对象发送 autorelease 消息意味着告诉它,在“一段时间之后”销毁。但是这里的“一段时间之后”并不意味着“任何时间”。我们将在后面的章节中详细讲述这个问题。现在,我们有了上面这个问题的一种解决方案:-(Point2D*) add:(Point2D*)p1 and:(Point2D*)p2 Point2D* result = Point2D alloc initWithX:(p1 getX + p2 getX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防安全每月培训内容课件
- 个人物品要有序教学课件
- 2025至2030中国互联网金融行业市场深度分析及前景趋势与投资报告
- 离婚财产分配合同范本:详尽规定财产分割流程
- 国际贸易中心物业管理权出让与商务服务合同
- 女性员工生育保障与工作权合同范本
- 水上乐园场地年租及经营管理合同范本
- 私立医院住院医师规范化培训基地聘用协议
- 精确执行民法典的办公场所租赁合同规范
- 部编版芦花鞋教学课件
- 业务连续性培训课件
- 医院检验科微生物进修汇报
- 2025年箱变考试题库
- 2024年河南省确山县卫生系统招聘考试(护理学专业知识)题含答案
- 病原微生物感染
- 【物理】2025届安徽省普通高中高三下学期高考全真模拟训练(三)试题(解析版)
- 激素类药物使用管理制度
- 自然保护区巡护监测员技能测试题库及答案
- 教育资源分配与教育公平的探索
- 消杀灭虫技术培训课件
- 中学实验室安全管理课件
评论
0/150
提交评论