Ref类
如果把Cocos2d比喻为一颗大树,那么Ref类可以说是这颗大树的根,Cocos2d中大部分类的源头都是Ref类,也就是说Ref是一个祖先类。它的主要作用是使用引用计数来管理资源,有点像shared_ptr。我们把其中最重要的代码截出来,如下所示。
class Ref
{
public:
void retain();
void release();
Ref* autorelease();
unsigned int getReferenceCount() const;
protected:
Ref();
public:
virtual ~Ref();
protected:
unsigned int _referenceCount;
friend class AutoreleasePool;
};
Ref()
Ref::Ref()
: _referenceCount(1)
{
}
Ref在构造函数的时候将引用计数设置为1。
~Ref()
Ref::~Ref()
{
#if CC_ENABLE_SCRIPT_BINDING
ScriptEngineProtocol* pEngine = ScriptEngineManager::getInstance()->getScriptEngine();
if (pEngine != nullptr && _luaID)
{
// if the object is referenced by Lua engine, remove it
pEngine->removeScriptObjectByObject(this);
}
#if !CC_ENABLE_GC_FOR_NATIVE_OBJECTS
else
{
if (pEngine != nullptr && pEngine->getScriptType() == kScriptTypeJavascript)
{
pEngine->removeScriptObjectByObject(this);
}
}
#endif // !CC_ENABLE_GC_FOR_NATIVE_OBJECTS
#endif // CC_ENABLE_SCRIPT_BINDING
#if CC_REF_LEAK_DETECTION
if (_referenceCount != 0)
untrackRef(this);
#endif
}
Ref在析构时移除了脚本(如果你是用脚本语言写的话)。
retain()
void Ref::retain()
{
CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
++_referenceCount;
}
在调用retain()时会判断引用计数是否大于零,如果否