A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© zhuhoulin 中级黑马   /  2015-7-21 14:37  /  656 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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动作。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马