cocos2d-x 内存管理(关于AutoreleasePool的疑惑)

void Director::mainLoop()
{
    if (_purgeDirectorInNextLoop)
    {
        _purgeDirectorInNextLoop = false;
        purgeDirector();
    }
    else if (_restartDirectorInNextLoop)
    {
        _restartDirectorInNextLoop = false;
        restartDirector();
    }
    else if (! _invalid)
    {
        drawScene();
     
        // release the objects
        //每一帧都会对当前releasePool进行clear(当时疑惑,重复clear,节点岂不是总是会被释放掉??)
        PoolManager::getInstance()->getCurrentPool()->clear();
    }
}

之前一直有疑惑 releasePool每一帧都被调用一次clear ,那节点总是会被释放掉的啊,,,后来终于找到答案;

void AutoreleasePool::clear()
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = true;
#endif
    std::vector<Ref*> releasings;
    //==========================答案就在这里==========================
    releasings.swap(_managedObjectArray);
    for (const auto &obj : releasings)
    {
        obj->release();
    }
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = false;
#endif
}

可以看到,在clear方法里,巧妙的用了swap方法。

swap用于vector 的方法说明:

vector<Contestant>(vecContestant).swap(vecContestant);

上面代码的意思是:

vector<Contestant>(vecContestant) 创建一个临时变量,它是 vecContestant的拷贝:这是由 vector的拷贝构造函数来完成的。然而,vector的拷贝构造函数只为 所拷贝的元素分配所需要的内存,所以这个临时变量里面没有多余的数据。然后我们做了 swap操作之后,vecContestant里面就是没有多余数据的 vector了,有着臃肿数据的 vector已经变成了刚刚 的临时变量。这条 语句的结尾,临时变量被析构,从而释放了 先前的 臃肿的 vector所占据的内存。

所以,正是因为用了swap,所以已经被release过的节点已经被踢出releasePool,所以也就不会被重复release操作了,解决了我很久的疑惑。

之前虽然看到有文档说删除对象什么的,但是是对C++的swap方法理解不深,没有参透,看来还是得多看书啊。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值