使用或者不使用自动管理对于编程接口来说是一样的,都是调用release或者autorelease来释放资源。只是他们释放资源的时机不同。release会立马释放资源,如果使用autorelease,他会标记自己,在主循环中由CCPoolManager来释放资源。CCPoolManager每一次循环只会释放一个需要释放的资源。这样保证了游戏运行的流畅度,避免出现卡顿的现象。所以释放多个资源时,一般使用autorelease可以获得更佳的表现。
不推荐手动调用delete来释放资源,不过delete已自动管理的对象不会出现空指针错误。因为在CCObject的析构函数中就已经将自己从CCPoolManager中移去了。你还是要保证其他地方没有使用已经被删除的指针,这个原则总是适用的。用delete可能破坏结构的完整性,不能释放掉全部的资源。
01 | bool HelloWorld::init() |
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)); |
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)); |
19 | void HelloWorld::LoadSprite( void ) |
21 | cocos2d::CCSprite* test; |
23 | test->initWithFile( "test.png" ); |
25 | sprites.push_back(test); |
27 | cocos2d::CCSprite* test2; |
28 | test2 = CCSprite::spriteWithFile( "test2.png" ); |
29 | sprites.push_back(test2); |
注意一点的是CCNode的addChild和removeChild会调用retain和release函数。下面的代码是可以工作的,注意到sprite1没有自动管理,removeformParent已经释放了资源,再一次调用release引发崩溃。
01 | bool HelloWorld::init() |
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)); |
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)); |
16 | sprite1->removeFromParentAndCleanup( true ); |
22 | void HelloWorld::LoadSprite( void ) |
24 | cocos2d::CCSprite* test; |
26 | test->initWithFile( "test.png" ); |
27 | sprites.push_back(test); |
29 | cocos2d::CCSprite* test2; |
30 | test2 = CCSprite::spriteWithFile( "test2.png" ); |
31 | sprites.push_back(test2); |
sprite1的添加覆盖掉了sprite2。图片和上面的代码是一样的。