1. 程式人生 > >cocos2dx.3.x之重要類分析(1)——Ref

cocos2dx.3.x之重要類分析(1)——Ref

Ref

ref類是cocos2dx引擎的基類 許多類都繼承於它 那麼為什麼呢? 我們先看看原始碼

class CC_DLL Ref
{
public:
   
    void retain();
    void release();
    Ref* autorelease();
    unsigned int getReferenceCount() const;

protected:
    Ref();

public:
    virtual ~Ref();

protected:
 
    unsigned int _referenceCount;

    friend class AutoreleasePool;

#if CC_ENABLE_SCRIPT_BINDING
public:
   
    unsigned int        _ID;
  
    int                 _luaID;
   
    void* _scriptObject;
#endif

#if CC_USE_MEM_LEAK_DETECTION
public:
    static void printLeaks();
#endif
};

我們可以很清楚的看到 Ref類包含了 cocos2dx用於自動記憶體管理的相關函式 為了便於進行自動管理 所以大多數的類都繼承了這個類


我們都知道 cocos2dx的記憶體管理是基於 引用計數 的機制來進行實現的  所以:

unsigned int _referenceCount; //這個變數就是引用計數器

void Ref::retain()  //引用計數加一
{
    CCASSERT(_referenceCount > 0, "reference count should greater than 0");
    ++_referenceCount;
}

void Ref::release()//引用計數減一 若為0則刪去此物件
{
    CCASSERT(_referenceCount > 0, "reference count should greater than 0");
    --_referenceCount;

    if (_referenceCount == 0)
    {

        delete this;
    }

}

Ref* Ref::autorelease()//將此物件加入自動管理池  從上面可以看到自動快取池是作為友緣宣告的
{
    PoolManager::getInstance()->getCurrentPool()->addObject(this);
    return this;
}

unsigned int Ref::getReferenceCount() const//常函式 此函式只能呼叫const函式 為只讀函式 返回計數引用
{
    return _referenceCount;
}

值得注意的一點是 Ref類的建構函式是protected 的 所以它僅用於繼承 並不能被例項化為單獨的物件 所以將它看做一個介面類比較好哦

綜上所述 :如果你不想自己處理記憶體管理 就讓物件 直接或者間接的繼承Ref類吧