cocos2d-x 3.0 ref類分析
阿新 • • 發佈:2019-02-09
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;
}