您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x内存管理

2014-08-28 22:48 176 查看
刚刚开始学习Cocos2d,查阅了一下源码,总结下使用需要注意的地方。

涉及到的几个类包括Ref、AutoreleasePool、PoolManager等。还有一个类是RefPtr,这个是个模板类,概念上相当于智能指针。

Ref

这个类中记录了一个引用计数_referenceCount。构造时初始化为1。另外还有三个比较重要的成员函数:
retain,引用计数自加1;release,引用计数自减1,并且,检查当引用计数为0的时候,调用delete this;autorelease,将this加入到当前的AutoreleasePool中。

Ref* Ref::autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject(this);
return this;
}
AutoreleasePool

主要是增加Ref*对象和clear,在调用clear的时候,遍历列表逐个调用Ref的release。在这里就可以看到Ref的自动释放的管理了。比如,在实际使用中调用Node::create时,首先引用计数设置为1,然后在create函数中自动调用autorelease,将Node加入到AutoreleasePool列表中,此后,如果没有其他操作(retain、release或者autorelease),在clear时,会调用release,引用计数减1,减为0,然后delete this。可以看出,当以后的操作retain和release(或autorelease)要成对出现,才能保证正确释放。
void AutoreleasePool::clear()
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
_isClearing = true;
#endif
for (const auto &obj : _managedObjectArray)
{
obj->release();
}
_managedObjectArray.clear();
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
_isClearing = false;
#endif
}

PoolManager
这个是使用单例模式,管理着所有的autorerealsePool。

RefPtr

这个相当于智能指针,模板参数T设置为Ref类型,其中包含了retain和release的调用。引用计数在智能指针里应该都不陌生。下篇内容,详细总结下智能指针。

inline RefPtr(RefPtr<T> && other)
{
_ptr = other._ptr;
other._ptr = nullptr;//源内容丢失
}
inline RefPtr<T> & operator = (RefPtr<T> && other)
{
if (&other != this)
{
CC_REF_PTR_SAFE_RELEASE(_ptr);
_ptr = other._ptr;
other._ptr = nullptr;
}

return *this;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存管理 cocos2d-x