在Objective-C或者说Cocoa里面,有三种内存的管理方式。
第一种,叫做“Garbage Collection”。这种方式和java类似,在你的程序的执行过程中,始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃圾。遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。所以“Garbage Collection”不是本入门指南的范围,对“Garbage Collection”内部机制感兴趣的同学可以参考一些其他的资料,不过说老实话“Garbage Collection”不大适合适初学者研究。
第二种,叫做“Reference Counted”。就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成1(我们把这个过程叫做alloc),然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)。紧接着程序A不再需要这段内存了,那么程序A就把这个计数器减1(我们把这个过程叫做release);程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)。当系统(也就是Foundation)发现这个计数器变成了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手工来完成。
这样做,有一个明显的好处就是,当我们不知道是A先不使用这段内存,还是B先不使用这段内存的时候,我们也可以非常简单的控制内存。否则,当我们在程序A里面释放内存的时候,还需要看看程序B是否还在使用这段内存,否则我们在程序A里面释放了内存之后,可怜的程序B将无法使用这段内存了。这种方式,尤其是在多线程的程序里面很重要,如果多个线程同时使用某一段内存的时候,安全的控制这些内存成为很多天才的程序员的梦魇。
如果有同学搞过COM的话,那么应该对Release/AddRef很熟悉了,其实Obejctive-C和他们的机制是一样的。
接下来,我需要解释一下Autorelease方式。上述的alloc->retain->release->dealloc过程看起来比较令人满意,但是有的时候不是很方便,我们代码看起来会比较罗嗦,这个时候就需要Autorelease。Autorelease的意思是,不是立即把计数器减1而是把这个过程放在线程里面加以维护。当线程开始的时候,需要通知线程(NSAutoreleasePool),线程结束之后,才把这段内存释放(drain)。Cocoa把这个维护所有申请的内存的计数器的集合叫做pool,当不再需要pool(水池)的时候就要drain(放水)。
笔者想要说的是,虽然iPhone支持Autorelease但是我们最好不要使用。因为Autorelease方式从本质上来说是一种延迟释放内存的机制,手机的空间容量有限,我们必须节约内存,确定不需要的内存应该赶快释放掉,否则当你的程序使用很多内存的情况下也许会发生溢出。这一个习惯最好从刚刚开始学习使用Objective-C的时候就养成,否则长时间使用Autorelease会让你变得“懒散”,万一遇到问题的时候,解决起来会非常耗费时间的。所以,还是关于内存管理,我们还是自己动手,丰衣足食。当然笔者不是说绝对不可以使用,而是当使用Autorelease可以明显减低程序复杂度和易读性的时候,还是考虑使用一下换一下口味。
第三种,就是传统而又原始的C语言的方式,笔者就不在这里叙述了。除非你在Objective-C里面使用C代码,否则不要使用C的方式来申请和释放内存,这样会增加程序的复杂度。
转
http://tech.ddvip.com/2009-04/1240213778115891_7.html
分享到:
相关推荐
objective-c 内存管理 alloc init release
Objective-C高级编程 iOS与OS X多线程和内存管理.pdf
Objective-C内存管理 刚接触的的人可能有些迷惑,看了本文 你将成为Objective-C内存管理高手 文字 高清版
第7章到第10章讲述objective-c的基础框架,以及文件操作、内存管理、数据保存等内容。第11章讲述了应用工具框架。第12、13章分别讲述了如何开发iphone/ipad应用程序。第14章讲述了objective-c++和访问mysql数据库的...
Objective-C 内存管理 深入浅出发,熟悉内存管理。
《Objective-C 程序设计(第4版)》已经为iOS 5和Xcode4.2中的重大变更做了全面更新,最大的改动是引入了自动引用计数(ARC),并详细说明了如何在Objective-C编程过程中使用ARC提升和简化内存管理。
初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏 或莫名其妙的崩溃。我在这里总结了自己对objective-C内存管理机制的研究成果和经验,写了这么一个由 浅入深的...
Objective-C高级编程 iOS与OS X多线程和内存管理.
详细介绍 objective-c内存管理和原理剖析
Objective-C内存管理课件.docx ,assign,retain,copy
Objective-C内存管理教程和原理剖析,很详细全面的内存管理教程
本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等众多重要的面向对象...
第二部分详细阐述了Foundation框架,涵盖数字、字符串、集合、文件操作、内存管理、对象复制和归档等重要内容;第三部分简要介绍了Cocoa和iPhone SDK;第四部分是附录,主要列出了Objective-C的快速参考。 ...
部分详细阐述了Foundation框架,涵盖数字、字符串、集合、文件操作、内存管理、对象复制和归 档等重要内容;第三部分简要介绍了Cocoa和iPhone SDK;第四部分是附录,主要列出了Objective- C的快速参考。 本书结构...
帮助学习关于OC中内存管理的知识点
Objective-C 2.0之前需要了解的:关于Obj-C内存管理的规则。
Objective-C的内存管理机制与.Net/Java那种全自动的垃圾回收机制是不同的,它本质上还是C语言中的手动管理方式,只不过稍微加了一些自动方法。 1 Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。 ...
第二部分详细阐述了foundation框架,涵盖数字、字符串、集合、文件操作、内存管理、对象复制和归档等重要内容;第三部分简要介绍了cocoa和iphone sdk;第四部分是附录,主要列出了objective-c的快速参考。. 本书结构...
《Objective-C基础教程》全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等...