cocos2d-x3.0之object内存管理

看object类的实现就行了。

首先映入眼帘的是它们:

protected:
    /// count of references
    unsigned int        _reference;
    /// count of autorelease
    unsigned int        _autoReleaseCount;

然后我们先看下_reference都在哪里被引用:


就是两个函数retain和release在修改它。

    /**
     * Retains the ownership.
     *
     * This increases the object's reference count.
     *
     * @see release, autorelease
     * @js NA
     */
    inline void retain()
    {
        CCASSERT(_reference > 0, "reference count should greater than 0");
        ++_reference;
    }

    /**
     * Release the ownership immediately.
     *
     * This decrements the object's reference count.
     *
     * If the reference count reaches 0 after the descrement, this object is
     * destructed.
     *
     * @see retain, autorelease
     * @js NA
     */
    inline void release()
    {
        CCASSERT(_reference > 0, "reference count should greater than 0");
        --_reference;

        if (_reference == 0)
            delete this;
    }

API提供的注释说的很清楚,retain增加引用,release减少,当减为0就释放,这种引用计数的方法到处可见,比如windows里对资源的管理。

但_autoReleaseCount怎么用的呢?

我们发现它是protected的,吐槽,改为【private的,用setter/getter比较友好。

这个东东是代码到处可见的addObejct里面会改变滴:

void AutoreleasePool::addObject(Object* object)
{
    _managedObjectArray->addObject(object);

    CCASSERT(object->_reference > 1, "reference count should be greater than 1");
    ++(object->_autoReleaseCount);
    object->release(); // no ref count, in this case autorelease pool added.
}

看到上一篇文章的clone吗,就会调到这里:

Array* Array::clone() const  
{  
    Array* ret = new Array();  
    ret->autorelease();

autorelease里面:

Object* Object::autorelease()
{
    PoolManager::sharedPoolManager()->addObject(this);
    return this;
}

void PoolManager::addObject(Object* object)
{
    getCurReleasePool()->addObject(object);
}
void AutoreleasePool::addObject(Object* object)
{
    _managedObjectArray->addObject(object);

    CCASSERT(object->_reference > 1, "reference count should be greater than 1");
    ++(object->_autoReleaseCount);
    object->release(); // no ref count, in this case autorelease pool added.
}

注意object在构造的时候

Object::Object()
: _luaID(0)
, _reference(1) // when the object is created, the reference count of it is 1
, _autoReleaseCount(0)
{
    static unsigned int uObjectCount = 0;

    _ID = ++uObjectCount;
}

两个引用是不一样的,程序里会适当地调用retain,不然在autorelease会释放一次,这要保证reference>0不然要被释放掉。

嗯,赶脚好麻烦,估计这部分要被干掉,用C++11自带的智能指针。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值