黑马程序员----Objective-C学习笔记之autorelease基本使用

------Java培训、Android培训、iOS培训、.Net培训--------

1、自动释放池及autorelease介绍

【自动释放池】

1)在ioc程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。

2)当一个对象调用autorelea时,会将这个对象放到位于栈顶得释放池中

 

【自动释放池的创建方式】

1)ios5.0以后

  @autoreleasepool {
//这个大括号内部就是自动释放池 
}


【autorelease】

是一种支持引用技术的内存管理方式

它可以【暂时保存某个对象】,然后再内存池自己的排干(drain)的时候对其中的每个对象发送release消息

【注意】这里只是发送release消息,如果当时的引用技术依然不为0,那么该对象依然不会被释放,可以用该方法来保存某个对象,但也要注意之后要释放该对象。

 

2、为什么会有autorelease

 

oc的内存管理机制中比较重要的一条就是:谁申请,谁释放。

考虑到这种情况,如果一个方法需要返回一个新建的对象,该对象何时释放?

方法内部是不会写release来释放对象的,因为这样做会将对象立即释放而返回一个空对象,调用者也不会主动释放该对象,因为调用者遵循【谁申请,谁释放】的原则,那么这个时候就会发生内存泄露。

【使用autorelease的好处】

1)不需要关心对象释放的时间

2)不需要关心什么时候调用release

 

3、autorelease的基本用法

【基本用法】

1)会将对象放到一个自动释放池中

2)当自动释放池被销毁时,会对池子里所有的对象发送release消息

3)会返回对象本身

4)调用完autore方法后,下属方法是合理的,即可以争取返回结果,也不会造成内存泄露

 

例如:

 

   Person *p = [Person new];
    @autoreleasepool {
        [p run];
        NSLog(@"retainCount =%lu",p.retainCount);
        //作用,把p加入到自动释放池
        [p autorelease];
        [p run];
        NSLog(@"retainCount =%lu",p.retainCount);
 
   }
    //此时在调用会报错(开启僵尸对象检测)
    //[p run];

打印结果;

2015-10-06 16:50:12.915 MRCDemo[2407:303] This personrun....

2015-10-06 16:50:12.917 MRCDemo[2407:303] retainCount= 1

2015-10-06 16:50:12.918 MRCDemo[2407:303] This personrun....

2015-10-06 16:50:12.918 MRCDemo[2407:303] retainCount= 1

2015-10-06 16:50:12.919 MRCDemo[2407:303] This persondead....

【分析结果】

p最后被自动释放了

 

 

【如果autoreleasepool销毁时对象的计数器仍不为0,就会出现内存泄露】

例如:

   

 Person *p = [Person new];
    @autoreleasepool {
        [p run];
        NSLog(@"retainCount =%lu",p.retainCount);
        [p retain]; //计数器+1
        //作用,把p加入到自动释放池
        [p autorelease];
        [p run];
        NSLog(@"retainCount =%lu",p.retainCount);
   }

打印结果:

2015-10-06 16:45:18.274 MRCDemo[2326:303] retainCount= 1

2015-10-06 16:45:18.276 MRCDemo[2326:303] retainCount= 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值