cocos2d-x 内存管理 retain release

    对于内存管理,官网上有很详细的解释

     http://www.cocos2d-x.org/wiki/Reference_Count_and_AutoReleasePool_in_Cocos2d-x

     但是从自己的使用经验和网上的搜索内容来看,还是有很多人被这个问题所困惑。


     知识这个东西,就是以自己的思维方式理解了才能成为自己的。所以在这里整理一下自己的理解。


     cocos2d-x的内存管理:

         1.  如果所有的类都是自己开发的,并且你熟悉c++, 那么尽管用c++的new, delete机制,不会有任何问题。

         2.  所谓内存管理,换一句话说就是内存自动回收。其好处是:自己负责申请内存,系统自动判断是否可以释放回收,这样程序员就省事了(也减少了犯错的几率)。

         2.  所有从cocos2d::CCObject 派生出来的类都是通过setautorelease()来实现内存自动回收的,具体来说就是当游戏每一帧结束的时候,如果没有人声明需要new出来的这块基于CCObject的内存,那么,这快内存就会被释放掉

         3.  如果一块基于CCObject的内存(用指针指示)被retain过一次,就表示这块内存里的东西多了一个人需要。

         4.  当一块基于CCObject的内存(用指针指示)被release过一次,就表示这块内存里的东西少了一个人需要。

         5.  当retain和release的次数相等时,表示已经没有人需要这块内存,那么按照第2条原则,这块内存在当前帧结束后就释放掉了,原先的指向此处的指针没有意义了。

         6.  所谓用create方法创建出来的内存默认都是调用了setautorelease()的。这也是cocos2d-x里创建类的标准方式。

         7. 当调用addChild时自动调用了retain, 对应的removeChild自动调用了release

      基于以上几点,我们就可以理解:

         1 为什么大部分情况下,我们不需要调用retain,release----------------因为大部分情况下我们通过调用addChild/removeChild的方式自动完成了这些调用

         2 什么情况下,我们需要自己retain------------------------------------------create了但是没有addChild的指针(内存)

         3 什么情况下,我们需要自己release---------------------------------------- a 你自己retain了,那你就要自己release

                                                                                                                  b 你用new函数产生一个派生自CCobject的对象,你可以用delete干掉它,也可以用release干掉它

                                                                                                                      因为实际上,release里面发现没人用这个内存时,自己就delete掉自己了

好吧,看下这几个让很多人迷糊的函数,到底有多简单:

//--------------调用它相当于说:有一个人不需要这块内存了,如果其他人也不需要了,那把内存delete掉

void CCObject::release(void)
{
    CCAssert(m_uReference > 0, "reference count should greater than 0");
    --m_uReference;


    if (m_uReference == 0)
    {
        delete this;
    }
}

//--------------调用它相当于说:这块内存我需要啊(言下之意:你们别给我扔了,老子还用呢)

void CCObject::retain(void)
{
    CCAssert(m_uReference > 0, "reference count should greater than 0");


    ++m_uReference;
}

//-------------调用它相当于说:妈(妈指的是:CCPoolManager,也就她能这么不辞辛苦给你擦屁股),这块内存你帮我看着,每帧结束的时候你都去看一眼,要是没人用,你就帮我删了。
CCObject* CCObject::autorelease(void)
{
    CCPoolManager::sharedPoolManager()->addObject(this);
    return this;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值