《C#妹妹和Objective-C阿姨对话录》(05)自动释放池--易做图队的外援
C#妹妹:内存的清理跟生活中的易做图一样是个麻烦事情啊
Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃
C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上的。
Objective-C阿姨:没错,就像现实生活中的易做图,扒房子不困难,推土机过来就好了,困难的是决定扒谁的房子。。。扒对了相安无事,扒错了弄个易做图的出来⋯⋯
C#妹妹:做个广告,.NET的垃圾回收机制是相当不错的。判断很准确~
Objective-C阿姨:没错,但是也要付出代价,依靠运行时检查废弃的对象,就好像依靠人口普查来确定那些房子没人用,是靠定时遍历来实现的,毕竟影响性能,并且回收也不可能那么及时。
C#妹妹:是的,垃圾回收其实是两部分工作,一个是“检查”,一个是“回收”,“检查”就是找到那些没人用的房子,在墙上写一个大大的被圆圈圈起来的“拆”字。“回收”就是把标有“拆”字的房子推平,并且把还在用的房子集中在一起,避免形成碎片。还有很重要的一点是,回收过程中程序是暂停状态的。
Objective-C阿姨:写拆字的国际惯例也符合啊?~整个过程好像很漫长,性能如何保证呢?
C#妹妹:.NET的运行时为了提高效率采取了很多方法。
首先它优先普查人口流动比较大的地区,人口流动大,意味着房子闲置的可能性比较大。这个主要通过代龄来优化的,对象占用的空间,每经过一次垃圾回收器的扫描,而没有被清理掉,代龄就加1。比如你04年买的房子,这时代龄为0,06年人口普查发现这套在用,代龄就变成1,08年人口普查有可能就不再检查这套房子了,因为你已经起码住了2年多了,搬家的可能性小些,垃圾回收器会重点检查上次人口普查之后新入住的那些房子。当然清理了0代的房子后,还没有足够的空间,垃圾回收器还会去检查1代甚至2代的房子的。
Objective-C阿姨:这就是歧视啊,怪不得我在上海买了房子也没户口,原来我是0代⋯⋯
C#妹妹:没法子啊,谁让效率优先呢?谁会在乎我们小百姓的公平~垃圾回收器第二个提高效率的方法是减少普查的次数,除非程序占用的内存超过规定,或者系统本身内存不富裕,不会轻易去搞内存普查这些烂事的。你以为垃圾回收器没事干就一直扫描啊,他们也是想多歇歇呢~
Objective-C阿姨:.NET垃圾回收也有这么多内幕啊
C#妹妹:小声点,你不想想,这年头没点内幕谁去易做图啊?Objective-C阿姨,你的对象管理就没有内幕?
Objective-C阿姨:嗯,有,不过相对比较河蟹~因为有那么点选择的余地,上次不是说过了html" target=_blank>通过“Retain、Release”统计对象的引用数量来判断对象是否可以回收,这种方法专业一点的名字叫“引用计数(reference counting)技术”。今天我继续往后讲“自动释放(Auto Release)技术”。
C#妹妹:自动释放?听起来好像蛮先进的,是不是跟我的垃圾回收差不多。
Objective-C阿姨:差的多,它的本质还是引用计数,其实并不自动化,只是简化了逻辑和代码而已。算是个外援吧,还拿那个悲剧的House类做个实验吧
01
<SPAN style=
"FONT-SIZE: 16px"
>#import
"House.h"
02
//先建一个需要被删除的对象 House类
03
@implementation
House
04
-(
void
) dealloc
//Objective-C在销毁对象的时候会自动调用这个方法
05
{
06
NSLog
(@
"房子被拆除了"
);
07
[
super
dealloc];
08
}
09
@end
10
</SPAN>
Objective-C阿姨:这个倒霉House类,只重载了dealloc这个方法,忘记了么?就是拆房子的时候会调用这个方法。接下来执行
补充:软件开发 , C语言 ,