《《深入浅出发Objective-C》 内存管理》.pdf

《《深入浅出发Objective-C》 内存管理》.pdf

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《《深入浅出发Objective-C》 内存管理》.pdf

第7 章 内存管理——打理傲娇程序的超级拖把 周末,忙里偷闲地自己当了大厨一回,买菜洗菜烧菜,弄了满满一桌丰盛佳肴好不开心。和家人吃 毕后,我们会怎么去处理饭桌上的残留呢?该洗的洗,该存的存,该倒的倒,把家里的状态打理成做饭 前一样干净,必要的清理工作就算完成了。 又一次周末,嫌自己弄太麻烦太劳累,这次决定上饭店去尽情一翻,点了满满一桌丰盛佳肴好不热 闹。享受完后,我们又会怎么去处理桌上的残留呢?拿抹布擦拭桌面?把碗筷归类?送去饭店的清洗 间?说不定饭店老板不但不会谢谢你,还生怕你把他们家的餐具给敲碎呢。其实,在饭店吃完后,我们 只需拍拍屁股走人便成,剩下收拾的事情,饭店清洁人员自然会处理干净的。 Objective-C 的内存管理机制,其实和上述的两种情况差不多,即自己申请内存自己释放(家里吃), 自己申请内存由自动释放池释放(上饭店)。家里吃饭虽然麻烦,但是有着自由和省钱的优势,以Objective -C 观点来看的话,就是想怎么用怎么用,想何时释放就何时释放。而饭店吃虽然贵些,但有着诱人的 重要优点:省事。谁不想肆意而为,让他人跟后面收拾残局呢? 本章,我们以吃饭为始,细细品位! 7.1 内存管理机制——出色程序的重要资本 内存管理向来是高级编程语言的重要知识点,起到承前启后的作用。而Objetive-C 作为C 语言的超 类,有着很多和C 语言相通的特性。如果曾经有使用过C 语言的话,会对这章内容的深刻理解很有帮 助。不过没接触过C 也没关系,毕竟Objective-C 是一门面向对象的高级编程语言,这章会将内存管理 的世界淋漓尽致地展现出来。 7.1.1 内存的创建和释放 让我们以Objective -C 世界中最最简单的申请内存方式展开谈谈关于一个对象的生命周期。首先, 创建一个对象: //“ClassName”是任何你想写的类名,比如NSString,NSArray 等等一切随意 id testObject = [[ClassName alloc] init]; 小贴士7-1: “alloc ”是Objective-C 中常用来申请内存块的方式。 此时,对于对象“testObject ”来说,他的引用计数就是1 了,原因是它调用了alloc 来创建了一块 只属于它的内存,这样对象的引用计数就得+1 。 另外,Objective -C 中的另两个关键字retain ,copy 也 会将对象的引用计数+1 。根据Ojbective -C 的内存管理机制,我们在使用完“testObject ”后需要释放它: [testObject release]; 此时,”testObject”的引用计数再次为0,他的生命周期,也就是他的使命结束,正式寿终正寝,Game Over !这就是一个对象的生命周期,精悍而强力! 对象的内存生命周期如图7-1: 图 7-1 引用计数过程 对象alloc 后引用计数变为1,随后再次执行retain ,引用计数再次+1 变为2 。第三次则调用了release 使得当前引用计数-1 又变回了1,当再次release 时,引用激素为0 对象被成功释放。 小贴士7-2 : release 后的对象,虽然已经释放,但是他的指针地址仍然存在,只是指向了一块已经释放且无用的内存。所以无论 从安全释放的角度还是编码习惯上,都建议在release 后直接赋个nil 来置空,即: [testObject release]; testObject = nil; 这样做仍然不算完全安全,试想在对testObject 释放时,我们并不知testObject 的引用计数是否已经是0 了,如果 对象引用计数已经是0 则会造成双重释放的问题。既然这样,我们需要在释放的代码之前插入一段判断语句,即: if (!testObject) { [testObject release]; testObject = nil; } 好程序员都是懒人,面对纷繁的对象需要我们管理,对每个对象都写上三行释放代码实在是过于麻烦,于是,释放 对象的宏出生了!即: #define RELEASE(obj) if(obj){[obj release]; obj = nil;} 调用一把此宏就执行一次安全释放,好用指数妥妥的!

文档评论(0)

taxe + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档