autorelease自动释放池

来源:互联网 发布:pcm-d50淘宝 编辑:程序博客网 时间:2024/05/16 11:05

一.自动释放

     什么是自动释放?字面意思就是一种事物用完之后就会自动脱落,用比喻就好比发射卫星的火箭,燃料用完了由于需要减轻重量,所以就得脱离主体.那么在oc中自动释放是什么意思呢?就是内存当中存有的数据,经过某些步骤到最后就释放了,也就是说不存在了.

二.自动释放池
     既然说起了自动释放了,那么就不能忽略自动释放池了.怎么表示呢?
@autoreleasepool {要实现代码块;}
          这就是代码的表现形式.接着我们来说说它的作用吧.
//在@autoreleasepool结束时或者被手动释放时,会对池中所有"加入了该池"的对象进行一次release操作,可以不再关心relea  se的调用时间,也不需要再关心对象释放的时间.
       前面我们已经说过了,release在内存中的作用了三句话:
       //1)谁引用,谁retain;
       //2)谁引用,谁release;
       //3)谁retain,谁release;
三.autorelease与release的区别

   那么怎么区分两者呢?我们来看看区别吧! 

   release是立即执行对象的retainCount -1操作,autorelease是让对象加入自动释放池,并不立即执行计数器-1操作,在自动释放池结束时再执行release操作,相当于release操作的延迟.

     我们来看看代码:

-(void)dealloc{    NSLog(@"Person 销毁了....内存释放");    [super dealloc];    }
     上面重写了父类的构造方法.看下面的访问.

 Person *per = [[Person alloc] init];                [per release];
     得出来的结果是:
[1383:1829431] Person 销毁了....内存释放
      这是为什么呢?因为在release的时候直接,也就是释放的时候,调用了重写的方法.所以就打印出来了结果.也就是说德dealloc什么时候才会执行呢,也就是在realease释放的时候直接调用了.

       Person *per = [[Person alloc] init];        //        [per release];
     当你注释掉了[per release]的时候是打印部出结果的.下面我们同过自动释放池来释放.

//        [per release];        [per autorelease];
[1401:1880907] Person 销毁了....内存释放
   看上面的结果完全的可以说明有些时候autoreleaserelease是可以相等的,但是又不完全相等.[per autorelease]设置在释放池自动销毁,并不是马上销毁.

四.autorelease作用的范围

 那么autorelease运用有多大的范围呢?我们来看看下面的程序吧!

 @autoreleasepool {        Person *per = [[Person alloc] init];//        [per release];//        [per autorelease];    }(1)//    [per autorelease];    NSLog(@"%p",per);//这段代码是无法执行的.
   由上面的程序,我们就可以看出来,当代码出了途中的(1)处的时候是无法打印出结果的,也就是说会报错.所以也就是说[per autorelease]这段代码的作用域的hi在离它最近的花括号.

五.autorelease的使用注意

//1.只有在池内调用autorelease方法才加入自动释放池: [obj autorelease]//2.每调用一次autorelease操作,自动释放池结束时会执行一次release操作,所以不要多次调用//3.自动释放池是释放的延迟,不要在池内创建过多的对象,也不要对占用内存大的对象使用autorelease//4.自动释放池嵌套:栈顶层池中的对象最先释放
   上面写的一定是使用的重点,使用的时候要特别的注意,否则就会出错.

六.autorelease的不足

   控制不灵活,只能等到释放池销毁才会release.不能很好的控制什么时候销毁,销毁的时候能调用dealloc,所以说不是很推荐用.最后我想说这是我分享给大家的我的心得,也是我的总结,希望对你们有用吧.


    
















       
0 0