OC学习笔记之autorelease

本文详细介绍了iOS开发中自动释放池的概念、使用方法及其注意事项。解释了自动释放池如何帮助开发者解决内存管理问题,并提供了具体的使用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

autorelease
   (1)自动释放池
       IOS运行的过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。当一个对象调用autorelease时,会将这个对象
       放到位于栈顶的释放池中。
       他是一种支持引用计数的内存管理方式。他可以暂时保存某个对象,然后在内存池自己排干的时候对其中的每个变量发送release消息
       注意:这里只是发送release消息,但是如果当时的引用计数依然不为0,则该对象依然不会被释放。可以用该方法保存某个对象,也
       要注意保存之后要释放对象。
   (2)自动释放池的创建方法
       IOS5.0之后的创建方法
            @autoreleasepool
            {                        //开始代表创建自动释放池
                 ...................
            }                       //结束代表销毁自动释放池
   (3)自动释放池是一种特殊的栈结构
       

为什么会有autorelease
     OC的内存管理机制的原则是“谁申请,谁释放”。如果一个方法需要返回一个新建的对象该如何释放?
     方法内部是不可能写release释放对象的;调用者也不会主动释放该对象的,因为调用者遵循"谁申请,谁释放的原则",这样的话就会
     产生内存泄露。正是基于此,autorelease才实现的。


使用autorelease的好处
    (1)不需要关心对象释放的时间
    (2)不需要关心什么时候调用release

autorelease的基本用法
     (1)会将对象放到一个自动释放池中
     (2)当自动释放池被销毁时,会将池子里的所有的对象做一次release
     (3)会返回对象本身

     (4)调用玩autorelease方法后,对象的计数器不收影响(销毁时影响)


注意事项:
    (1)并不是所有的放到自动释放池的中代码,产生的对象就会自动释放,如果需要释放,必须加入自动释放池
       Person *p = [Person new];  
        @autoreleasepool{
              
             [p autorelease];//加入自动释放池
         }//结束后,开始对象的release动作。
    (2)如果对象调用了autorelease,但是调用的时候,并不是在任何自动释放池中,该对象也不会被加入到自动释放池中
       Person *p = [Person new];  
        @autoreleasepool{
              
         }//结束后,开始对象的release动作。
          [p autorelease];
    (3)autorelease的使用其实是延迟了空间的释放,所以不建议在autoreleasepool中使用太多的代码。
        Person *p = [Person new];  
        @autoreleasepool{
              //10000行代码
             [p autorelease];//加入自动释放池
         }
         注:P的释放只有在10000行代码运行完成之后才会释放P的空间。
    (4)不要将大量的循环操作放到同一个@autorelease之间,会造成内存峰值的上升。
        Person *p = [Person new];  
        @autoreleasepool{
             [p autorelease];//加入自动释放池
             for(int = 0; i < 10000; i++){
                   Person *temp = [[Person new] autorelease];//不能这么使用
             }
         }
    (5)autorelease之后,注意release的使用是否必要;



自动释放池的嵌套使用
   (1)基本用法
       @autoreleasepool{        //该autorelease在栈底
             @ autoreleasepool{ //该autorelease在栈中
                   @autoreleasepool{//该autorelease在栈顶




                           [p autorelease];
                    }
                    [p autorelease];
             }
       }
    (2)
       @autoreleasepool{        //该autorelease在栈底
             @ autoreleasepool{ //该autorelease在栈中
                   @autoreleasepool{//该autorelease在栈顶




                           [p autorelease];
                    }
                    [p autorelease];
                    [p autorelease];
                    [p autorelease];//不建议这样使用,这样使用,会导致对象的多次release。
             }



自动释放池的使用
    (1)创建自动释放池
        @autoreleasepool{


        }
    (2)对象加入自动释放池
        Person *p = [Person new];  
        @autoreleasepool{
              
             [p autorelease];
         }//结束后,开始对象的release动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值