Cocos2dx内存管理
来源:互联网 发布:传智播客云计算大数据 编辑:程序博客网 时间:2024/05/16 17:57
CCAutoreleasePool
CCAutoreleasePool的逻辑是,当你调用object->autorelease(),object就被放到自动释放池中。自动释放池能够帮助你保持这个object的生命周期,直到当前消息循环的结束。在这个消息循环的最后,假如这个object没有被其他类或容器retain过,那么它将自动释放掉。例如,layer->addChild(sprite),这个sprite增加到这个layer的子节点列表中,他的声明周期就会持续到这个layer释放的时候,而不会在当前消息循环的最后被释放掉。
这只有两种情况你需要调用release()方法
你new一个cocos2d::CCObject子类的对象,例如CCSprite,CCLayer等。
- 你得到cocos2d::CCObject子类对象的指针,然后在你的代码中调用过retain方法。
使用静态构造函数
CCSprite::create(“player.png”)是一个使用静态构造函数的例子。所以在Cocos2d-x中所有的类,除了单例,都提供了静态构造函数,这些静态构造函数包含下面4项操作:
新建一个对象
调用object->init(…)
假如初始化成功,例如,成功的找到纹理文件,那么接下来将会调用object->autorelease()。
- 返回这个已经被标记了autorelease的对象。
所有CCAsdf::createWithXxxx(…)这种类型的函数都有以上这些方式。
一个错误的例子
一个开发者报告了一个使用CCArray 并导致crash的例子
bool
HelloWorld::init()
{
bool
bRet =
false
;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////
CC_BREAK_IF(! CCLayer::init());
//////////////////////////////////////////////////////////////////////////
// add your codes below...
//////////////////////////////////////////////////////////////////////////
CCSprite* bomb1 = CCSprite::create(
"CloseNormal.png"
);
CCSprite* bomb2 = CCSprite::create(
"CloseNormal.png"
);
CCSprite* bomb3 = CCSprite::create(
"CloseNormal.png"
);
CCSprite* bomb4 = CCSprite::create(
"CloseNormal.png"
);
CCSprite* bomb5 = CCSprite::create(
"CloseNormal.png"
);
CCSprite* bomb6 = CCSprite::create(
"CloseNormal.png"
);
addChild(bomb1,1);
addChild(bomb2,1);
addChild(bomb3,1);
addChild(bomb4,1);
addChild(bomb5,1);
addChild(bomb6,1);
m_pBombsDisplayed = CCArray::create(bomb1,bomb2,bomb3,bomb4,bomb5,bomb6,NULL);
//m_pBombsDisplayed 是在头文件中被定义为一个 protected 变量.
// <--- 我们应该添加在这里m_pBombsDisplayed->retain()方法来防止在HelloWorld::refreshData()中crash。
this
->scheduleUpdate();
bRet =
true
;
}
while
(0);
return
bRet;
}
void
HelloWorld::update(ccTime dt)
{
refreshData();
}
void
HelloWorld::refreshData()
{
m_pBombsDisplayed->objectAtIndex(0)->setPosition(cpp(100,100));
}
他的错误是m_pBombsDisplayed是使用CCArray::create(…)创建的,这种创建方式是静态构造方式,这个数组被标记了autorelease。
所以这个数组会在当前消息循环的最后被CCAutoreleasePool释放掉。
当后面的消息循环调用HelloWorld::update(ccTime)的时候,m_pBombsDisplayed已经是一个野指针了,这就将引起崩溃。
为了修复这个崩溃情况,我们需要增加m_pBombsDisplayed->retain()在 m_pBombsDisplayed =CCArray::create(…);之后, 并且在 HelloWorld::~HelloWorld() 的析构函数中调用m_pBombsDisplayed->release()。
- cocos2dx 内存管理
- cocos2dx 内存管理
- Cocos2dx-------->内存管理
- Cocos2Dx 内存管理封装
- Cocos2Dx 内存管理封装
- cocos2dx 内存管理
- cocos2dx的内存管理
- cocos2dx 内存管理
- cocos2dx 内存管理
- cocos2dx内存管理
- cocos2dx内存管理
- cocos2dx 内存管理
- cocos2dx 内存管理
- cocos2dx 的内存管理
- Cocos2dx内存管理
- cocos2dx 内存管理
- cocos2dx内存管理
- cocos2dx内存管理感想
- LeetCode String to Integer (atoi)
- 数字证书原理
- 职场需求---Android开发
- Action中的list值传值到js获取并填充下拉框
- 泛型初步理解
- Cocos2dx内存管理
- MATLAB数据拟合(二)
- windows下编译lua源码
- SQL/NoSQL两大阵营激辩:谁更适合大数据
- Linux下Java线程详细监控和其dump的分析使用----分析Java性能瓶颈[张振华-Jack]
- PHP开发环境配置问题汇总
- poj2185 Milking Grid(KMP运用)
- 从零开始学android<Tablelayout表格布局.十五.>
- HTML 字符实体