autorelease自动释放池

一.自动释放

      什么是自动释放?字面意思就是一种事物用完之后就会自动脱落,用比喻就好比发射卫星的火箭,燃料用完了由于需要减轻重量,所以就得脱离主体.那么在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 销毁了....内存释放
   看上面的结果完全的可以说明有些时候 autorelease release 是可以相等的,但是又不完全相等.[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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值