内存管理部分主要依靠三个类
class CC_DLL Ref (Ref类是引用计数类)
//引用计数减一,如果引用计数小于1,则delete this
void Ref::release()
{
CCASSERT(_referenceCount > 0, "reference count should greater than 0");
--_referenceCount;
if (_referenceCount ==0)
{ delete this; }
}
//加载到自动管理池中
Ref* Ref::autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject(this);
returnthis;
}
- Ref对象要在子类里面创建,不能直接实例化Ref
- Ref创建后的引用计数为1
- 使用retain来增加1 次对这个对象的引用 计数
- 调用 release时会减少一次对象的引用 计数,当引用计数为0的时候就会销毁这个对象。
- 用到了一个PoolManager对象列表管理器来管理Ref对象
- autorelease是通过内存管理器来释放对象的,并且对象调用 autorelease函数时并没有减少引用计数值
class CC_DLL AutoreleasePool
AutoreleasePool::AutoreleasePool(): _name("")
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0),
_isClearing(false)
#endif
{
_managedObjectArray.reserve(150);
PoolManager::getInstance()->push(this);
}
AutoreleasePool::AutoreleasePool(const std::string &name): _name(name)
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0),
_isClearing(false)
#endif
{
_managedObjectArray.reserve(150);
PoolManager::getInstance()->push(this);
}
AutoreleasePool::~AutoreleasePool()
{
CCLOGINFO("deallocing AutoreleasePool: %p",this);
clear();
PoolManager::getInstance()->pop();
}
//外部的mainLoop大循环中每一帧调用一次clear();
void AutoreleasePool::clear()
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
_isClearing = true;
#endif
for (const auto &obj : _managedObjectArray)
{
obj->release();//将内存自动释放池的容器中的对象进行release处理(引用计数减一,如果小于一则删除掉)
}
_managedObjectArray.clear();//清空容器,未删掉的处于游离状态,切换场景时移除
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
_isClearing = false;
#endif
}
void AutoreleasePool::addObject(Ref* object)
{
_managedObjectArray.push_back(object);
}
class CC_DLL PoolManager
原文链接:https://www.f2er.com/cocos2dx/343127.html