- 1、本文档共23页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)