对于内存管理,官网上有很详细的解释
http://www.cocos2d-x.org/wiki/Reference_Count_and_AutoReleasePool_in_Cocos2d-x
但是从自己的使用经验和网上的搜索内容来看,还是有很多人被这个问题所困惑。
知识这个东西,就是以自己的思维方式理解了才能成为自己的。所以在这里整理一下自己的理解。
cocos2d-x的内存管理:
1. 如果所有的类都是自己开发的,并且你熟悉c++, 那么尽管用c++的new, delete机制,不会有任何问题。
2. 所谓内存管理,换一句话说就是内存自动回收。其好处是:自己负责申请内存,系统自动判断是否可以释放回收,这样程序员就省事了(也减少了犯错的几率)。
2. 所有从cocos2d::CCObject 派生出来的类都是通过setautorelease()来实现内存自动回收的,具体来说就是当游戏每一帧结束的时候,如果没有人声明需要new出来的这块基于CCObject的内存,那么,这快内存就会被释放掉
3. 如果一块基于CCObject的内存(用指针指示)被retain过一次,就表示这块内存里的东西多了一个人需要。
4. 当一块基于CCObject的内存(用指针指示)被release过一次,就表示这块内存里的东西少了一个人需要。
5. 当retain和release的次数相等时,表示已经没有人需要这块内存,那么按照第2条原则,这块内存在当前帧结束后就释放掉了,原先的指向此处的指针没有意义了。
6. 所谓用create方法创建出来的内存默认都是调用了setautorelease()的。这也是cocos2d-x里创建类的标准方式。
7. 当调用addChild时自动调用了retain, 对应的removeChild自动调用了release
基于以上几点,我们就可以理解:
1 为什么大部分情况下,我们不需要调用retain,release----------------因为大部分情况下我们通过调用addChild/removeChild的方式自动完成了这些调用
2 什么情况下,我们需要自己retain------------------------------------------create了但是没有addChild的指针(内存)
3 什么情况下,我们需要自己release---------------------------------------- a 你自己retain了,那你就要自己release
b 你用new函数产生一个派生自CCobject的对象,你可以用delete干掉它,也可以用release干掉它
因为实际上,release里面发现没人用这个内存时,自己就delete掉自己了
好吧,看下这几个让很多人迷糊的函数,到底有多简单:
//--------------调用它相当于说:有一个人不需要这块内存了,如果其他人也不需要了,那把内存delete掉
void CCObject::release(void)
{
CCAssert(m_uReference > 0, "reference count should greater than 0");
--m_uReference;
if (m_uReference == 0)
{
delete this;
}
}
//--------------调用它相当于说:这块内存我需要啊(言下之意:你们别给我扔了,老子还用呢)
void CCObject::retain(void)
{
CCAssert(m_uReference > 0, "reference count should greater than 0");
++m_uReference;
}
//-------------调用它相当于说:妈(妈指的是:CCPoolManager,也就她能这么不辞辛苦给你擦屁股),这块内存你帮我看着,每帧结束的时候你都去看一眼,要是没人用,你就帮我删了。
CCObject* CCObject::autorelease(void)
{
CCPoolManager::sharedPoolManager()->addObject(this);
return this;
}