先上代码:
void Ref::retain()
{
CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
++_referenceCount;
}
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;
}
}
前者的作用是。。。。额,就一句话++_referenceCount;。那么到底有啥用呢?先看Sprite::create()的代码
Sprite* Sprite::create(const std::string& filename)
{
Sprite *sprite = new (std::nothrow) Sprite();
if (sprite && sprite->initWithFile(filename))
{
sprite->autorelease();
return sprite;
}
CC_SAFE_DELETE(sprite);
return nullptr;
}
一,autorelease的作用
看过cocos2d-x的内存管理机制的朋友都知道 (没看过???来来来~~~http://blog.youkuaiyun.com/u012723995/article/details/45504669)
被继承自Ref的类创建的对象会被加入cocos2d-x的内存管理机制,这样这个对象在游戏中的每一帧都会被autorelease给监视着,如果这个对象没人认领,即引用计数为0,则 将其杀掉
二,那么retain的作用便是
认领这个对象。这样这个对象就不会autorelease给杀掉
而
三,release的作用是
这个对象实在是没用了,我主动把你杀掉了(那能不能仁慈点,不杀呢?。。。。 不杀你给我内存啊,这样会造成内存泄露)
四,具体什么时候用retain
通常我们没用retain的时候不是也是好好的吗,没错,但是那是因为之后他被addChild的了,这样这个对象就被当做孩子认领了,自然不会再受到autorelease的威胁
所以,当这个对象是个成员对象时,即被添加了内存管理机制,同时有没addChild时,我们要对其retain。