加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 21:15:23 所属栏目:百科 来源:网络整理
导读:内存管理部分主要依靠三个类 class CC_DLL Ref (Ref类是引用计数类) //引用计数减一,如果引用计数小于1,则delete this void Ref::release() { CCASSERT(_referenceCount 0 , " reference count should greater than 0 " ); -- _referenceCount; if (_refer

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读