码迷,mamicode.com
首页 > 其他好文 > 详细

关于cocos2d-x的AutoreleasePool

时间:2015-03-11 19:11:24      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

大家之所以觉得cocos2d-x容易上手入门,估计就是因为AutoreleasePool(个人以为)

PoolManager 管理 AutoreleasePool

class CC_DLL PoolManager
{
    AutoreleasePool *getCurrentPool() const;  
    std::vector<AutoreleasePool*> _releasePoolStack;
};

 

class CC_DLL AutoreleasePool
{
    void addObject(Ref *object);
    void clear();
    bool contains(Ref* object) const;
    void dump();
}

AutoreleasePool 的实现会让大牛觉得不屑;

 

void DisplayLinkDirector::mainLoop()
{
...
        PoolManager::getInstance()->getCurrentPool()->clear();
}

直接看clear

void AutoreleasePool::clear()
{
    for (const auto &obj : _managedObjectArray)
    {
        obj->release();
    }
    _managedObjectArray.clear(); // 留意这里,这里清空了
}

可以看到,遍历并release并清空

所以一开始 _managedObjectArray.reserve(150); 已经足够。

 

关注 _managedObjectArray

void AutoreleasePool::addObject(Ref* object)
{
    _managedObjectArray.push_back(object);
}

见CCObject(3.0换成了Ref)

Ref* Ref::autorelease()
{
    PoolManager::getInstance()->getCurrentPool()->addObject(this);
    return this;
}

 

这就是 autorelease 的意义

以Speed动作对象为例

Speed* Speed::create(ActionInterval* action, float speed)
{
    Speed *ret = new (std::nothrow) Speed();
    if (ret && ret->initWithAction(action, speed))
    {
        ret->autorelease();
        return ret;
    }
    CC_SAFE_DELETE(ret);
    return nullptr;
}

实际上,AutoreleasePool autorelease 等和 引用计数没有什么关系。引用技术是release 和 retain 的技术。

 

关于cocos2d-x的AutoreleasePool

标签:

原文地址:http://www.cnblogs.com/d20062303732/p/4330660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!