zoukankan      html  css  js  c++  java
  • 浅谈cocosd之autorelease etain elease的理解

    三种情况,引出问题:

      1) new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会出现野指针情况。

     ==> 于是出现了引用计数的释放管理机制。

      2) 对于一个返回对象指针的方法,你若不看文档不看内部代码,你无法知道这个指针需不需要你来释放。同样的对于将一个指针或者对象作为参数给一个方法后, 你也无法知道这个方法会不会将你的对象释放掉。

     ==>  于是出现了谁拥有谁释放的管理思想。

      3使用上述管理机制和思想后,有些特定情况。比如方法内新建一个对象,然后返回对象时,按照谁拥有谁释放的思想,对象是在方法内部创建的,方法退出前需要释放掉这个对象,但又要在退出时返回这个对象,先返回还是先释放都是不对的。

     ==>  于是出现了autorelease。

            

    1、release和retain是配套的,释放管理是通过引用计数的。

           每一个CCObject对象都有一个引用计数。retain()是引用计数+1,release()时引用计数-1。在release()之后,如果引用计数为0,便会delete this,真正释放自己的内存。CCObject新建的时候,引用计数默认为1。

    2、release和retain的使用指导思想是:谁拥有谁释放。

           对于一个需要释放的变量。它的生命中通过新建、传递参数、方法返回 出现在各个地方,然而只有有人需要长期使用它时,才应调用retain(),释放时秉承“"谁retain谁release",retain和release调用次数需要配套使用。

    3、autorelease是一个特殊的release,即延后释放。

          autorelease的对象会加入到池中,最迟会在主循环结束前释放。

          池是用栈形式管理的。在适当情况下新建一个自动释放池,加入到栈中。所有要自动释放的对象都会提前加入到当前栈顶的这个池中。在特定情况下(如每次主循环结束前),将池出栈。出栈时,做一些释放池中对象的处理。

          当CCObject释放时,如果该对象仍在自动释放池中,则从池中删除自己。

          同一个对象多次autorelease()的话,会多次加入池中。池中对象存储的结构是CCMutableArray,也就是vector。

    4、使用autorelease的好处

    1)new出来的对象释放问题解决了。符合谁拥有谁释放原则。

    2)可以避免频繁申请/释放内存。

        

  • 相关阅读:
    hashCode()相同,equals()也一定为true吗?
    什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题?
    LOJ114_k 大异或和_线性基
    BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数
    BZOJ_4184_shallot_线段树按时间分治维护线性基
    BZOJ_2844_albus就是要第一个出场_线性基
    BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论
    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图
    BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组
    BZOJ_1532_[POI2005]Kos-Dicing_二分+网络流
  • 原文地址:https://www.cnblogs.com/kane0526/p/8081773.html
Copyright © 2011-2022 走看看