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)要成对出现,才能保证正确释放。
PoolManager
这个是使用单例模式,管理着所有的autorerealsePool。
RefPtr
这个相当于智能指针,模板参数T设置为Ref类型,其中包含了retain和release的调用。引用计数在智能指针里应该都不陌生。下篇内容,详细总结下智能指针。
inline RefPtr(RefPtr<T> && other)
{
_ptr = other._ptr;
other._ptr = nullptr;//源内容丢失
}
涉及到的几个类包括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 内存管理
- cocos2d-x V3.x内存管理分析
- Cocos2d-x学习笔记(四)—— 内存管理
- 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制
- Cocos2d-x内存管理研究<二>
- Cocos2d-x 的内存管理
- Cocos2d-x 内存管理中retain() 、autoRelease()、release()
- Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
- Cocos2d-X的内存管理
- 深入理解 Cocos2d-x 内存管理 转
- [置顶] Cocos2d-x学习(十五):Cocos2d-x内存管理(一)
- cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
- Cocos2d-X内存管理研究<一>
- Cocos2D-x内存管理的原则
- cocos2d-x学习笔记:内存管理
- cocos2d-x内存管理注意事项
- Cocos2d-x::内存管理
- cocos2d-x 源码分析 : Ref (CCObject) 源码分析 cocos2d-x内存管理策略
- Cocos2d-x 内存管理中retain() 、autoRelease()、release()
- Cocos2d-x 内存管理浅说