cocos2d-x 内存管理3

使用或者不使用自动管理对于编程接口来说是一样的,都是调用release或者autorelease来释放资源。只是他们释放资源的时机不同。release会立马释放资源,如果使用autorelease,他会标记自己,在主循环中由CCPoolManager来释放资源。CCPoolManager每一次循环只会释放一个需要释放的资源。这样保证了游戏运行的流畅度,避免出现卡顿的现象。所以释放多个资源时,一般使用autorelease可以获得更佳的表现。

不推荐手动调用delete来释放资源,不过delete已自动管理的对象不会出现空指针错误。因为在CCObject的析构函数中就已经将自己从CCPoolManager中移去了。你还是要保证其他地方没有使用已经被删除的指针,这个原则总是适用的。用delete可能破坏结构的完整性,不能释放掉全部的资源。

01 bool HelloWorld::init()
02 {
03     CCSize size = CCDirector::sharedDirector()->getWinSize();
04          CCSprite* sprite = new CCSprite;
05     sprite->initWithFile("HelloWorld.png");
06     sprite->setPosition(ccp(size.width/2, size.height/2));
07  
08     CCSprite* sprite1 = *(sprites.begin());
09     sprite1->setPosition(ccp(size.width/2, size.height/2));
10     CCSprite* sprite2 = *(++sprites.begin());
11     sprite2->setPosition(ccp(size.width/2, size.height/2));
12     delete sprite2;
13     addChild(sprite);
14     addChild(sprite1);
15 //  addChild(sprite2);
16     return true;
17 }
18  
19 void HelloWorld::LoadSprite( void )
20 {
21     cocos2d::CCSprite* test;
22     test = new CCSprite;
23     test->initWithFile("test.png");
24     test->autorelease();
25     sprites.push_back(test);
26  
27     cocos2d::CCSprite* test2;
28     test2 = CCSprite::spriteWithFile("test2.png");
29     sprites.push_back(test2);
30 }

注意一点的是CCNode的addChild和removeChild会调用retain和release函数。下面的代码是可以工作的,注意到sprite1没有自动管理,removeformParent已经释放了资源,再一次调用release引发崩溃。

01 bool HelloWorld::init()
02 {
03     CCSize size = CCDirector::sharedDirector()->getWinSize();
04          CCSprite* sprite = new CCSprite;
05     sprite->initWithFile("HelloWorld.png");
06     sprite->setPosition(ccp(size.width/2, size.height/2));
07  
08     CCSprite* sprite1 = *(sprites.begin());
09     sprite1->setPosition(ccp(size.width/2, size.height/2));
10     CCSprite* sprite2 = *(++sprites.begin());
11     sprite2->setPosition(ccp(size.width/2, size.height/2));
12  
13     addChild(sprite);
14     addChild(sprite1);
15     addChild(sprite2);
16     sprite1->removeFromParentAndCleanup(true);
17 //  sprite1->release();
18     addChild(sprite1);
19     return true;
20 }
21  
22 void HelloWorld::LoadSprite( void )
23 {
24     cocos2d::CCSprite* test;
25     test = new CCSprite;
26     test->initWithFile("test.png");
27     sprites.push_back(test);
28  
29     cocos2d::CCSprite* test2;
30     test2 = CCSprite::spriteWithFile("test2.png");
31     sprites.push_back(test2);
32 }

sprite1的添加覆盖掉了sprite2。图片和上面的代码是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值