IOS开发第三天-内存管理2

来源:互联网 发布:osi模型网络层相关 编辑:程序博客网 时间:2024/06/06 00:42

自动释放池

为了保证函数、方法返回的对象不回在被返回之前就被销毁,需要保证被函数、方法返回的对象能被延迟销毁。有两种方法来达到这个效果:

  1. 程序每次获取并使用完其他方法、函数返回的对象之后,立即调用该对象的release方法将函数、方法返回对象的引用计数-1.
  2. 使用自动释放池进行延迟销毁。
自动释放池:是指它是一个存放对象的容器(比如集合),而自动释放池会保证延迟释放该池中所有的对象。出于自动释放的考虑,所有的对象都应该添加到自动释放池中,这样可以让自动释放池在销毁之前,先销毁池中的所有对象。为了把一个对象添加到自动释放池中,可调用该对象的autorelease方法,该方法的原型为:-(id) autorelease;该方法不会修改对象的引用计数,并且返回调用该方法的对象本身。其最终也是调用release去将引用计数-1。
LWBItem* productItem(){     LWBItem* item=[LWBItem new];     retrun [item autorelease];}
自动释放池的销毁时机

自动释放池的销毁时机于其他普通对象的销毁时机相同,只要自动释放池的引用计数为0,系统就会自动释放自动释放池对象。自动释放池就是一个OC对象,同样遵循相同的对象回收机制。创建和销毁自动释放池的代码末班如下:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc] init];.....[pool release];
使用NSAutoreleasepool创建对象后,该对象的引用计数为1,当调用release之后,该对象的引用计数为0,系统准备调用NSAutoreleasePool的dealloc方法来回收该对象。在NSAutorleasePool中还提供了一个drain方法来释放自动释放池的对象。与realease不同,realease会导致自动释放池自身的引用计数变为0,而drain方法只是回收池中所有对象,并不回收自动释放池本身。

对于Foundation中的类而言,当调用方法创建对象时,只要这些方法不是以alloc、new、copy、mutableCopy开头的,系统就会默认创建自动释放的对象。例如:

NSMutableArray* array=[[NSMutableArray alloc] init];//使用array对象...[array release];

以上的对象通过alloc来创建,其并不是一个自动释放对象,因此需要调用[array release]将其引用计数-1;

而通过以下方法建立array对象:

NSMutableArray* array=[NSMutableArray arrayWithCapacity:20]
则array被加入到自动释放池中就会被自动释放,因此这中对象也被称为临时对象。

被自动加入到自动释放池中的对象被称为临时对象,此对象会被自动释放

事件循环:

所谓事件循环,指的是当程序中某个组件事件被激发(比如:按钮被单击)后,系统将会回调某个方法来处理该事件。事件循环步骤:

  1. 创建自动释放池;
  2. 调用事件处理方法;
  3. 销毁自动释放池;
  4. 处理完成,方法返回。
手动内存管理规则总结:

手动内存管理作为OC中的难点内容,下面为手动内存管理规则:

  • 调用对象的release方法并不是销毁该对象,只是将该对象的引用计数-1;当一个对象的引用计数为0时,系统会自动调用该对象的dealloc方法来销毁该对象;
  • 当自动释放池被回收时,自动释放池会依次调用池中每一个对象的release方法。如果该对象调用release方法后引用计数变为0,那么该对象将被销毁,否则不能销毁。
  • 当程序使用alloc、new、copy、mutableCopy开头的方法创建对象后,该对象的引用计数为1,当不使用该对象时,需要调用该对象的release方法或者autorelease方法。
  • 如果使用retain方法为对象增加过引用计数,则用完该对象后需要调用release方法来减少对该对象的引用计数,并保证retain次数与release次数相等。
  • 如果通过其他方法获取了对象,且该对象时一个临时对象,那么在用完该对象后无需理会该对象的回收,系统自动回收该对象。如果程序需要保留这个临时对象,则需要手动调用retain来增加该临时对象的引用计数;或者将该临时对象赋值给retain、strong或copy指示符修饰的属性。
  • 在Cocoa或者IOS的事件循环中,每个事件处理方法执行之前会自动创建释放池,方法执行完成后会回收自动释放池。为了保证自动释放池被回收后,池中某些对象能“活”下来,程序必须增加该对象的引用计数,保证该对象的引用计数大于它调用autorelease的次数。
自动引用计数

从IOS5开始,系统引入了ARC机制,即自动引用计数机制。自动引用计数同样是基于引用计数的,只不过由系统来负责跟踪对象的引用计数,系统可以判断何时需要保持对象,何时需要自动释放对象。

@autoreleasepool块

@autoreleasepool块自动定义自动释放上下文,任何在该上下文中创建的对象都由ARC来自动释放,并在自动释放块结束时销毁这些对象。


0 0