cocos2d-x的AutoreleasePool

假如没有 AutoreleasePool 代码应该是这样的:

CCSprite *sprite = CCSprite:create() // new CCSprite()
node->addChild(sprite);
sprite->release(); // 必须放在addChild之后。

 

没有了 AutoreleasePool,cocos2d-x也可以工作,不讨论AutoreleasePool的意义。

AutoreleasePool 让sprite(设置了autorelease)的生命周期多了一个托管者(只托管一次)。

addChild等操作会retain一次对象,假如不retain,这个代码范围之后,sprite将被 release 并 delete;

对应的removeChild会release一次对象

引用计数可以告诉 AutoreleasePool 是否 delete 对象,但引用计数的意义不止如此?

 

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 等和 引用计数有点关系。

 

转载于:https://www.cnblogs.com/d20062303732/p/4330660.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值