1. 程式人生 > >cocos2d-x 3.0 ref類分析

cocos2d-x 3.0 ref類分析

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

class CC_DLL Ref
{
public:


//計數加1
    void retain();

//計數減1,如果為0,刪除物件
    void release();


//新增到物件池中,別忘了PoolManager(物件池管理器) 管理AutoreleasePool(物件池),AutoreleasePool管理Ref
    Ref* autorelease();


//得到當前的計數
    unsigned int getReferenceCount() const;

protected
: //建立時計數設為1 Ref(); public: virtual ~Ref(); protected: /// count of references //計數變數 unsigned int _referenceCount; //友元類 friend class AutoreleasePool; #if CC_ENABLE_SCRIPT_BINDING public: /// object id, ScriptSupport need public _ID unsigned int _ID; /// Lua reference id
int _luaID; #endif };

Ref類包含了 cocos2dx用於自動記憶體管理的相關函式 為了便於進行自動管理 所以大多數的類都繼承了這個類
如果你不想自己處理記憶體管理 就讓物件 直接或者間接的繼承Ref類吧

uObjectCount 為計數器, 記錄多少物件繼承 Ref類
Ref::Ref(): _referenceCount(1)
{
#if CC_ENABLE_SCRIPT_BINDING
  static unsigned int uObjectCount = 0;
  _luaID = 0;
  _ID = ++uObjectCount;
  _scriptObject = nullptr;
#endif
#if CC_REF_LEAK_DETECTION trackRef(this); #endif }
retain 函式為新建一個物件時候所使用的, 每次新建時候計數器加一
void Ref::retain()
{
    CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
    ++_referenceCount;
}
release 為釋放函式 ,釋放一個物件的時候 計數器減去1
void Ref::release()
{
  CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
  --_referenceCount;
  if (_referenceCount == 0)
  {
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    auto poolManager = PoolManager::getInstance();
    if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this))
    {
      CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool.");
    }
#endif
#if CC_REF_LEAK_DETECTION
    untrackRef(this);
#endif
    delete this;
  }
}
以及
Ref* Ref::autorelease()//將此物件加入自動管理池  從上面可以看到自動快取池是作為友緣宣告的
{
    PoolManager::getInstance()->getCurrentPool()->addObject(this);
    return this;
}

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