先上代码:
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://www.jb51.cc/article/p-pkeqdyzk-k.html)
被继承自Ref的类创建的对象会被加入cocos2d-x的内存管理机制,这样这个对象在游戏中的每一帧都会被autorelease给监视着,如果这个对象没人认领,即引用计数为0,则 将其杀掉
二,那么retain的作用便是
认领这个对象。这样这个对象就不会autorelease给杀掉
而
三,release的作用是
这个对象实在是没用了,我主动把你杀掉了(那能不能仁慈点,不杀呢?。。。。 不杀你给我内存啊,这样会造成内存泄露)
四,具体什么时候用retain
通常我们没用retain的时候不是也是好好的吗,没错,但是那是因为之后他被addChild的了,这样这个对象就被当做孩子认领了,自然不会再受到autorelease的威胁
所以,当这个对象是个成员对象时,即被添加了内存管理机制,同时有没addChild时,我们要对其retain。
原文链接:https://www.f2er.com/cocos2dx/341780.html