Cocos2d-X3.0 ----- 内存管理源码分析

内存管理部分主要依靠三个类

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;

}

  1. Ref对象要在子类里面创建,不能直接实例化Ref
  2. Ref创建后的引用计数为1
  3. 使用retain来增加1 次对这个对象的引用 计数
  4. 调用 release时会减少一次对象的引用 计数,当引用计数为0的时候就会销毁这个对象。
  5. 用到了一个PoolManager对象列表管理器来管理Ref对象
  6. 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

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...