关于Objective-C 2.0垃圾收集介绍

移动开发 iOS
iPhone的操作系统目前并不支持垃圾收集,如果你希望做iPhone开发或者希望你的程序在未来移植到iPhone,尽量不要在程序中使用垃圾收集。

Objective-C 2.0垃圾收集是本文要介绍的内容,主要是来学习Objective-C 2.0垃圾收集的问题,具体内容先来先本文详解。Objective-C 2.0***的增强可能就是垃圾收集了(Garbage Collection)。与“垃圾收集”对应的是传统的引用计数(Reference Count)内存管理形式。

使用了垃圾收集意味着大部分情况下《Very simple rules for memory management in Cocoa >>所介绍的工作你在程序中都不需要做了,系统会自动帮你管理好这些问题。如果你没有阅读过《Very simple rules for memory management in Cocoa >>,请先阅读一下。否则你可能不知道“垃圾收集”说的到底是什么。

另外,iPhone的操作系统目前并不支持垃圾收集,如果你希望做iPhone开发或者希望你的程序在未来移植到iPhone,尽量不要在程序中使用垃圾收集。

什么是垃圾收集?

简单说来,垃圾收集可以被认为是“自动内存管理”的意思,就是说内存中不再使用的对象会被称做“垃圾”,垃圾收集的作用就是帮你自动释放掉这些“垃圾”以免程序占用过多不必要的内存。

传统的内存管理形式本站已经有所介绍了,所谓垃圾收集主要用于解决内存泄露问题。当你手工建立一个对象,而没有在不需要的时候释放它,那么它就保存在内存当中。如果创建了很多对象,那么就需要占用很多内存。少量的内存泄露不是很大的问题,但是当没有释放的内存过多时,就会出现很大的问题了,比如程序运行缓慢、占用内存过大等。 如果你程序在持续运行,这些对象如果没有在不需要的时候被释放,那么它们就会慢慢“吃光”你的内存。

垃圾收集对于不知道如何管理内存,但是具有很多好点子并且能够动手编写一定程序的人尤为有用。因为他们可以忽略掉麻烦的内存管理,而把大部分时间关注于如何实现一个可以跑起来的好点子。

如何使用垃圾收集?

在项目设置中打开垃圾收集选项即可,如图所示。

关于Objective-C 2.0垃圾收集介绍

说明

以下介绍关于Objective-C 2.0垃圾收集(简称GC)的几个关键点。

1、由于垃圾收集包含在Objective-C 2.0 runtime库里,所以如果你的程序使用了垃圾收集,那么只能跑在Leopard及以后版本上。

2、默认XCode是会关闭GC的,要打开的话需要修改项目的Build选项。

3、gcc打开垃圾收集的参数是:-fobjc-gc

4、Core Foundation对象也同样支持垃圾收集

5、打开垃圾收集后,retain、release和autorelease将不再工作。但是如果你的程序中包括这些内存管理方法,打开GC并不会影响你的程序。

6、如果你的Objective-C 程序和C、C++共存,那么你可以在用Objective-C的时候不考虑内存释放,但是在C或者C++时还是必须考虑内存释放的问题。

7、如果在打开垃圾收集的情况下明确需要释放某个对象,使用-finalize方法。

8、苹果建议***不要同时支持垃圾收集和传统的引用计数,虽然编译器允许这样做。

垃圾收集的好处:

1、对懒人或者初学者来说,你可以不用再考虑对象是否释放和什么时候释放。这意味着你可以节省更多时间,同时减少出错和内存泄露的可能。

2、当时间推移,由于减少了很多工作量和学习门槛,可能会有更多Java或者其他开发人员转入Objective-C开发。

3、使用旧的引用计数内存管理方式的程序不会因为打开了GC而受到任何影响。

4、如果开发多线程程序,相比从前手工进行内存管理更加简单。

垃圾收集的坏处:

1、如果你想让程序兼容Tiger,那么你就没法使用垃圾收集,还是要用引用计数的形式编写程序。

2、可能的性能降低。如果你使用过Java,你可能会对垃圾收集对性能的影响有所了解。不过这仅仅是坏处之一,因为大部分情况下你是不会感觉到使用了GC的程序有什么速度变慢的问题。

3、如果你希望某个对象长期保存而不被释放,可能需要将其做为全局变量。

4、正如本文前面提到的,iPhone并不支持垃圾收集。如果你希望程序未来兼容iPhone,那么不要考虑使用垃圾收集。

小结:关于Objective-C 2.0垃圾收集介绍的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 博客园
相关推荐

2011-08-04 15:14:39

Objective-C 数据类型

2011-08-15 17:29:36

Objective-C构造函数

2011-08-01 11:37:41

iPhone Objective- 内存

2011-08-17 10:00:12

Objective-CProperty

2011-08-17 09:55:45

Objective-CCategory

2011-08-15 14:02:36

Objective-C

2011-07-20 13:34:37

Objective-C self.

2013-03-27 12:54:00

iOS开发Objective-C

2013-06-20 10:40:32

Objective-C实现截图

2011-05-11 11:20:26

Objective-C

2011-05-11 15:58:34

Objective-C

2011-08-10 18:07:29

Objective-C反射

2011-08-04 16:46:03

Objective-C 声明

2014-06-25 14:02:59

Objective-CKVO

2011-08-04 09:35:09

Objective-C 编码规范

2014-04-30 10:16:04

Objective-CiOS语法

2011-08-17 10:58:59

Objective-C构造函数

2011-08-03 16:55:05

Objective-C 代理

2011-07-29 16:16:30

Objective-c block

2012-06-15 09:47:48

Objective-CCategory
点赞
收藏

51CTO技术栈公众号