cocos2d-x之retain与release
先上代码: 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.52php.cn/article/p-pkeqdyzk-k.html) 被继承自Ref的类创建的对象会被加入cocos2d-x的内存管理机制,这样这个对象在游戏中的每一帧都会被autorelease给监视着,如果这个对象没人认领,即引用计数为0,则 将其杀掉
二,那么retain的作用便是 认领这个对象。这样这个对象就不会autorelease给杀掉
而 三,release的作用是 这个对象实在是没用了,我主动把你杀掉了(那能不能仁慈点,不杀呢?。。。。 不杀你给我内存啊,这样会造成内存泄露)
四,具体什么时候用retain 通常我们没用retain的时候不是也是好好的吗,没错,但是那是因为之后他被addChild的了,这样这个对象就被当做孩子认领了,自然不会再受到autorelease的威胁
所以,当这个对象是个成员对象时,即被添加了内存管理机制,同时有没addChild时,我们要对其retain。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |