使用这个垃圾决定规则后,垃圾回收过程就变成如下的方式了。
首先,启动应用程序。在一定的时间内,按照自己的方式创建对象,将创建完成的对象放在一边。当创建的对象的数量积累到一定的程度,暂时停止应用程序的运行,启动垃圾回收程序。垃圾回收程序从所有的根对象开始追踪,在需要的对象上做标记。最后将没有标记的对象当做垃圾,一次性回收。增加了应用程序可使用的内存空间后,再重新开始运行应用程序。
10.3.2Objective—C与垃圾回收
像这样如此方便的垃圾回收功能,在Cocoa+Objective—C环境中使用了吗?答案是肯定的。但是,是从Objective—C2.0开始的。也就是说,MacOSX10.5以前的版本中是没有使用的。
因此,从现在开始,如果要开发新的应用程序则可以使用垃圾回收的功能,而且也建议使用。因为这个功能真的很方便。
另外,也存在不应使用垃圾处理的情况。
1.如果需要在MacOSX10.4中运行时
如果应用程序要运行在MacOSX10.4版本以及更旧的版本中,则垃圾回收处理将不能使用,因为垃圾回收必须在Objective—C2.0中使用。
2.在过去代码基础上开发的情况下
如果不是新开发的应用程序,而是在过去的应用程序的基础上开发的情况下,则最好放弃使用垃圾回收的功能。因为,将使用垃圾回收的代码与不使用垃圾回收的代码混在一起,管理起来非常麻烦。
有人会说,将旧代码部分也改造成使用垃圾回收的形式不就可以了吗?最好别那么做,辛辛苦苦调试好的代码,最好还是原封不动直接使用为好。另外,如果将其改造成使用垃圾回收的形式,还可能会出现后面将会介绍的性能问题,所以还是不要蛮干。
3.以性能作为最重要指标的应用程序
垃圾回收是很方便的,但是有一个缺点就是影响性能。垃圾回收的机制是在进行垃圾回收的时候,必须停止应用程序的运行。而且这个垃圾回收的过程还是非常费时间的,因为你必须检查已存在的几万个,甚至几十万个对象。
如果应用程序非常重视性能,有时会忍痛放弃使用垃圾回收处理,而采取手动的内存管理方式。像这样的应用程序有需要实时处理的系统,以及游戏这样需要立即反应的应用程序等。另外,像嵌入式设备(iPhone就是嵌入式设备),其本身CPU的处理速度就慢,内存也没有多少,最好不要使用垃圾回收功能。
……
展开