Cocos2d-x内存管理

刚刚开始学习Cocos2d,查阅了一下源码,总结下使用需要注意的地方。
涉及到的几个类包括Ref、AutoreleasePool、PoolManager等。还有一个类是RefPtr,这个是个模板类,概念上相当于智能指针。

Ref
这个类中记录了一个引用计数_referenceCount。构造时初始化为1。另外还有三个比较重要的成员函数:

retain,引用计数自加1;release,引用计数自减1,并且,检查当引用计数为0的时候,调用delete this;autorelease,将this加入到当前的AutoreleasePool中。

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

AutoreleasePool
主要是增加Ref*对象和clear,在调用clear的时候,遍历列表逐个调用Ref的release。在这里就可以看到Ref的自动释放的管理了。比如,在实际使用中调用Node::create时,首先引用计数设置为1,然后在create函数中自动调用autorelease,将Node加入到AutoreleasePool列表中,此后,如果没有其他操作(retain、release或者autorelease),在clear时,会调用release,引用计数减1,减为0,然后delete this。可以看出,当以后的操作retain和release(或autorelease)要成对出现,才能保证正确释放。
void AutoreleasePool::clear()
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = true;
#endif
    for (const auto &obj : _managedObjectArray)
    {
        obj->release();
    }
    _managedObjectArray.clear();
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = false;
#endif
}

PoolManager

这个是使用单例模式,管理着所有的autorerealsePool。


RefPtr

这个相当于智能指针,模板参数T设置为Ref类型,其中包含了retain和release的调用。引用计数在智能指针里应该都不陌生。下篇内容,详细总结下智能指针。

inline RefPtr(RefPtr<T> && other)
    {
        _ptr = other._ptr;
        other._ptr = nullptr;//源内容丢失
    }
inline RefPtr<T> & operator = (RefPtr<T> && other)
    {
        if (&other != this)
        {
            CC_REF_PTR_SAFE_RELEASE(_ptr);
            _ptr = other._ptr;
            other._ptr = nullptr;
        }
        
        return *this;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值