在C#中都有GC在自动管理内存,但是在OC中没有垃圾回收机制,那么OC中内存又是如何管理呢?其实在OC中内存的管理是依赖对象引用计数器(reference counTIng)来进行的。
OC中每个对象都有一个与之对应的整数,叫“引用计数器”,当一个对象在创建之后它的引用计数器值加1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器值自动在原来的基础上加1,当调用这个对象的release方法之后它的引用计数器值减1,如果一个对象的引用计数器值为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。
ARC计数的基本概念
ARC自动引用计数(automaTIc reference counTIng),当你在编译程序时提供自动管理内存的功能,
它会为程序自动加入内存的控制代码,控制独享声明周期。这样一来,就可以简化内存管理步骤。
不过支持的版本是在iOS4,iOS5以上
注意创建项目的时候,勾选ARC功能
垃圾回收机制的基本概念
与Java语言相同ObjecTIve-c 2.0之后,也提供了垃圾回收机制。但是在iOS移动终端设备中,并不
支持垃圾回收机制。因此,iPhone并不能对内存进行自动垃圾回收处理(autorelease)。因此需要注意
垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存,编译器会再适当的地方
自动插入retain,release和autorelease消息。
ARC介于自动垃圾回收(GC)和手动内存管理之间。就像垃圾回收,ARC让程序员不再需要书写retain/release/autorelease语句。但它又不同于垃圾回收,ARC无法处理retaincycles。在ARC里,如果两个对象互相强引用(strong references)将导致它们永远不会被释放,甚至没有任何对象引用它们。
因此,尽管ARC能免去程序员大部分内存管理问题,但仍然要程序员自己避免retaincycles或手动打断对象之间的retain循环。
ARC和苹果的垃圾回收之间还有一个重要的不同:ARC不是强制的。而对于苹果的垃圾回收,要么整个程序都使用,要么都不用。也就是说在app中的所有O-C代码,包括所有的苹果框架和所有的第3方库必须支持垃圾回收,才能使用垃圾回收。相反,ARC和非ARC代码可以在一个app中和平共处。这使得将项目可以零星地迁移到ARC 而不会像垃圾回收起初遇到的各种兼容性和稳定性的问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)