七十九、基础框架(三十七)内存管理-垃圾收集机制

来源:互联网 发布:彩虹岛淘宝店铺 编辑:程序博客网 时间:2024/06/06 03:31

到目前  为止,我们  创建的应用程序  都是  运行在内存管理环境中的。上一篇博文所总结的内存管理规则  就适用于  这种环境。在内存管理环境中  我们  需要处理  自动释放池、增加  或者  减少  物件的引用次数、物件  归谁  所有这些问题。

在Objective-c 2.0当中  有  一种内存管理的代替方案  可以使用,叫做  垃圾收集机制。有了  垃圾收集机制,你  就不用担心  增加、减少  物件的引用次数,自动释放池等等。系统  在程序执行的过程中  会自动追踪  哪些物件  属于  哪些物件  并且  在某些物件  不再需要的时候  将  他们占用的内存空间  清理掉。

如果  事情  真的  这么简单,那么  为什么  我们 不  从头到尾  都利用  垃圾收集机制  并且  跳过  所有关于内存管理的讨论呢?有  三个理由  使  我们  不这么做:

第一个理由:就算  运行环境  支持  垃圾收集机制,我们  最好还是  要知道  哪些物件  归谁所有,什么时候  不再需要  哪些物件了。这样  在你  编写  代码时  会使  你  对  物件之间的关系  以及  他们的生存周期  引起  高度的重视。

第二个理由:iPhone的运行环境  并不支持  垃圾收集机制,于是  如果  你  为iPhone平台  开发  应用程序,那么  你  就别无  选择了。

第三个理由:如果  你编写的  是  库、插件  或者  共享代码,那么  这些代码  既可能  载入  有垃圾收集机制的进程;也可能  载入  没有垃圾收集机制的进程。这些代码  必须  在两种环境当中  都能工作。这  就意味着  你  必须使用  我们之前讨论过的内存管理技巧。这  同样  意味着  你  必须  在启用垃圾收集机制  和  不启用垃圾收集机制的情况下  测试  你的代码。

如果  你  决定  使用  垃圾收集机制,那么  在编译  程序的时候,你  必须将  其  开启。首先  点击  Sample这个项目:

接着  点击  Build Settings

再找到  Apple LLVM compiler 3.0-Language这个大类:

再在这个大类中  找到  Objective-C Garbage Collection选项:

接着  点击  Unsupported,就会出现  弹出式菜单:

最后  选择  弹出式菜单中的最后一个选项。

当垃圾收集机制  启动后,你  同样  可以  在程序当中  采取  retain,autorelease,release  和  dealloc这些措施。但是  这些措施  都会被忽略掉。用这种方式开发出来的应用程序  既可以  在内存管理环境中  运行  也可以  在垃圾收集环境中  运行。