注册 登录
主题 : 浅析Objective-C的内存管理机制
级别: 新手上路
UID: 7140
精华: 1
发帖: 1
可可豆: 61 CB
威望: 61 点
在线时间: 5(时)
注册时间: 2009-07-19
最后登录: 2015-08-11
0 楼:  发表于: 2009-08-27 00:11    发自: Web Page

浅析Objective-C的内存管理机制   

管理提醒: 本帖被 gagaga 设置为精华(2009-08-27)
最近iphone平台比较火,大家都一窝蜂的上了。不过貌似好多都是从Java转过来的程序员,用惯了Java的,对Objective- C可能会不大适应,特别是Objective-C的内存管理机制。手机平台不同于计算机,虽然开发的应用都是小巧的应用,但是由于手机硬件上的局限性,如果不对内存好好管理的话,还是会出很多问题的,特别是习惯了垃圾回收机制的Java程序员,最容易忽视这个问题。希望下面这篇文章能对大家有所帮助。


Objective-C使用了一种叫做持有计数(Retain Count)的机制来管理内存中的对象。
  在Objective-C中每个对象都对应着他们自己的持有计数(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息时,持有计数数值会增加。相反,当你像一个对象发送release消息时,持有计数数值会减小。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。
   为什么要使用持有计数这个概念呢?
  想象一下,有时候你会在多个不同对象中引用同一个对象。当你在一个地方释放这个公用对象时,势必会对其他引用这个公用对象的对象产生影响。但是如果每当你引用这个公用对象时,都向持有计数发送一个retain消息,释放一个对象时,发送一个release消息。这样对象的持有计数会记录到底有多少个对象引用了它自己。当它的持有计数变为0的时候,这意味着没有其他对象引用这个对象了,那么它可以安全的释放自己所占用的内存。
对上面情况的一个比较形象的比喻,假设我们有一条狗和几个用绳子牵着这条狗的人,那么不到最后一个人松掉手中的绳子,这只狗是不能获得自由的。而持有计数的作用就是记录了到底有多少个人牵着绳子。
不同于Java的垃圾回收,Objective-C提供了持有计数这种特别机制。它给予了开发者们更多的控制权,去控制什么时候和怎么样来释放一个对象,但是这同时需要开发者们更加的细心。如果你过早的释放了一个对象,那么你的应用程序很可能会意外宕掉。相反,如果你很长时间不释放对象占用的内存,那么应用程序在运行了一段时间后很可能会造成内存泄漏。
   数组(Array)是一个比较特别的例子,当你往数组里面添加一个对象时。数组里面存储的并不是这个对象的拷贝,而只是一个指向该对象的指针。数组在保存这个指针的同时会向指针所指的对象发送一个retain消息,相应的,对象的持有计数会增加。将对象从数组中移除的时候,同样会向对象发送release消息,对象的持有计数会减小。当我们释放这个数组时,会向保存在这个数组中的所有对象发送release消息。看下面的两个例子:

1、没有释放内存的版本
array = [[NSMutableArray alloc] init];
for ( i = 0; i < 10; i++) {
newNumber = [[NSNumber alloc]initWithInt:(i * 3)];
[array addObject:newNumber];
}

上面的代码在创建newNumber对象时,向对象的发送了retain消息,对象的持有计数变为1。当向array中添加这个对象的引用时,又向对象发送了一次retain消息,这样对象的持有计数就变为2了,在使用完array时,我们会习惯性的释放掉array,但这样并不会释放array所持有的对象,而只是使所有对象的持有计数变为1,这些对象依然会占用着内存。

2、释放内存的版本
for (i = 0; i < 10; i++) {
newNumber = [[NSNumber alloc]initWithInt:(i*3)];
[array addObject:newNumber];
[newNumber release];
}
清空我的评分动态本帖最近评分记录: 共可可豆条评分记录
gagaga 贡献值 +5 2008-09-19
隐藏评分记录
级别: 管理员

状态: 连续签到 - [3天]
UID: 2
精华: 9
发帖: 7689
可可豆: 73323 CB
威望: 73449 点
在线时间: 5514(时)
注册时间: 2008-03-29
最后登录: 2018-04-05
1 楼:  发表于: 2009-08-27 00:15    发自: Web Page
楼主出手就是精华阿……

个人觉得解释retain解释的非常清楚。多谢分享。
In all thy ways acknowledge Him, and He shall direct thy paths.
级别: 光明使者

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2018-04-07
2 楼:  发表于: 2009-08-27 00:22    发自: Web Page
占个坑先不拉。。。。
[ 此帖被lvyile在2009-08-27 12:38 AM重新编辑 ]

 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 新手上路
UID: 7140
精华: 1
发帖: 1
可可豆: 61 CB
威望: 61 点
在线时间: 5(时)
注册时间: 2009-07-19
最后登录: 2015-08-11
3 楼:  发表于: 2009-08-27 00:25    发自: Web Page
这么快就回复而且设精,CocoaChina的人气果然比较旺啊!

--
驴坝和谐
cclv
[ 此帖被lvyile在2009-08-27 12:37 AM重新编辑 ]

级别: 管理员

状态: 连续签到 - [3天]
UID: 2
精华: 9
发帖: 7689
可可豆: 73323 CB
威望: 73449 点
在线时间: 5514(时)
注册时间: 2008-03-29
最后登录: 2018-04-05
4 楼:  发表于: 2009-08-27 00:49    发自: Web Page
还请楼主多多分享。
In all thy ways acknowledge Him, and He shall direct thy paths.
级别: 光明使者

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2018-04-07
5 楼:  发表于: 2009-08-27 00:51    发自: Web Page
引用
引用第4楼gagaga于2009-08-27 12:49 AM发表的  :
还请楼主多多分享。


七夕都过完乐,您咋还不睡??

gaga大通常不超过12点啊。 。。。
 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 侠客
UID: 7075
精华: 0
发帖: 30
可可豆: 941 CB
威望: 941 点
在线时间: 128(时)
注册时间: 2009-07-16
最后登录: 2014-04-20
6 楼:  发表于: 2009-08-27 04:29    发自: Web Page
顶一个,好贴
春风不解江南语
级别: 精灵王

UID: 2236
精华: 5
发帖: 214
可可豆: 34631 CB
威望: 34633 点
在线时间: 2353(时)
注册时间: 2009-02-17
最后登录: 2016-08-17
7 楼:  发表于: 2009-08-27 08:37    发自: Web Page
Mark,学习!
最近被这玩意儿搞得满晕的
级别: 侠客
UID: 7891
精华: 0
发帖: 82
可可豆: 1542 CB
威望: 1772 点
在线时间: 496(时)
注册时间: 2009-08-17
最后登录: 2017-03-22
8 楼:  发表于: 2009-08-27 08:48    发自: Web Page
好贴,顶一个。
知识在于积累,成功在于知识的积累。我要坚持每天不断地积累知识,成功才能一步一步向我靠近。
级别: 新手上路
UID: 8100
精华: 0
发帖: 1
可可豆: 70 CB
威望: 70 点
在线时间: 5(时)
注册时间: 2009-08-24
最后登录: 2009-11-29
9 楼:  发表于: 2009-08-27 09:23    发自: Web Page
强大   受益匪浅

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部