关于引擎内存管理的细节,网上有大量的详解,这里概括一下:

cocos2d-x 的世界是基于 CCObject 类构建的,所以内存管理的本质就是管理一个个 CCObject。

//CCObject 内部维护着一个引用计数,引用计数为 0 就自动释放
unsigned int m_uReference;
//管理内存的实质就是管理这些 “引用计数” 了,使用 retain 和 release 方法对引用计数进行操作
void release(void);//引用计数:--m_uReference
void retain(void); //引用计数:++m_uReference
CCObject* autorelease(void);

这里引入了自动释放池的概念,它的作用是:每一帧都检测池中对象的引用计数。为什么需要它?

>>使用create创建一个对象时候,我们可能并不立即使用,这时为了保证在使用之前不会被释放掉,就让它存活一帧,所以初始引用计数为1。

>>如果当前帧结束了,仍然没有使用,则在帧过渡时,自动释放池会遍历池中的对象,使其引用计数-1,释放掉对象,所以下一帧就不存在了。

//初始化一个对象
static CCObject* create()
{
//new CCObject 对象
CCObject *pRet = new CCObject();
if (pRet && pRet->init())
{
//添加到自动释放池
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = ;
return ;
}
} //我们看到初始化的对象 自引用 m_uReference = 1
CCObject::CCObject(void)
:m_uAutoReleaseCount()
,m_uReference() // when the object is created, the reference count of it is 1
,m_nLuaID()
{
static unsigned int uObjectCount = ;
m_uID = ++uObjectCount;
} //标记为自动释放对象
CCObject* CCObject::autorelease(void)
{
//添加到自动释放池
CCPoolManager::sharedPoolManager()->addObject(this);
return this;
}

由此可见,创建的对象如果没有使用,则会交由自动释放池自动释放掉,不需要担心。那如何才算使用了呢?

》任何导致引用计数增加++(>1)的行为都算是使用了:

CCNode* node = CCNode::create()
//方式一:retain
CCSprite* sp = CCSprite::create("a.png");
sp->retain(); //如果不retain,以后就用不到了
//方式二:交给父类,隐式retian
node->addChild(sp);//此时它的释放由它的父类来管理了
node->setSprite(sp);//或者赋值给成员变量

最后列几个需要注意的地方:

1>CCArray创建之后,需要retain,在使用该数组的类中析构函数中release它。

2>new出来的对象,即不采用cocos2dx内置的内存管理方式时,尤其要注意手动释放delete,因为它没有添加到自动释放池中,导致初始时的引用计数1没有释放。

3>new和create的一个重大区别:没有走父类的init()函数。有些父类(例Widget)在init()中做了一些初始工作,此时new出来的对象缺少这部分操作(有些成员没有初始化),在释放的时候会报错。这种情况主要发生在new一个CCNode及其子类对象的身上。

最新文章

  1. LAMP环境
  2. [.net 面向对象编程基础] (11) 面向对象三大特性——封装
  3. JavaWeb---总结(十)JSP标签
  4. IE兼容性
  5. mysql怎么导入大文件的sql文件
  6. mysql 日志
  7. linux i2c 设备节点读写
  8. (jdbc)取得数据库自动生成的主键方法
  9. InnoDB: Error: could not open single-table tablespace file
  10. 无法解决 equal to 运算中 "Chinese_PRC_BIN" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突
  11. 怎样衡量一个组员在团队中的Performance
  12. javacv
  13. java 小结2 多态问题和容器介绍
  14. C语言常用数学函数及其用法
  15. 1A Theatre Square
  16. 《Linear Algebra and Its Applications》-chaper1-线性方程组-线性相关性
  17. qemu 调试(二)
  18. 创建maven项目pom.xml第一行报错
  19. k8s经典实战—搭建WordPress
  20. ubuntu常见问题解决方法

热门文章

  1. Java:日历类、日期类、数学类、运行时类、随机类、系统类
  2. Java:抽象类abstract和接口Interface
  3. IOS系统中使用zepto的live事件绑定不了的一个办法
  4. openfire插件开发1
  5. Volley HTTP库系列教程(5)自定义一个Volley请求
  6. 《OD大数据实战》MapReduce实战
  7. 图解phpstorm常用快捷键
  8. Java关键字static、final
  9. hdu1051(LIS | Dilworth定理)
  10. 函数fsp_fill_free_list