ios sdk把引用计数封装到了NSAutoreleasePool中,Cocos2d-x也克隆了一套CCAutoreleasePool 两者用法一致
注意以下两点
CCAutoreleasePool 不能被开发者自己创建,Cocos2d-x为每个游戏创建一个自动释放池实例对象,我们不能新建自动释放池,需要我们做的是专注与release/retain Cocos2d::CCObject对象
CCAutoreleasePool 不能被用到多线程中,当你的游戏需要网络线程时,应仅在网络线程中接收数据,改变状态标志,不要在这个线程里调用cocos2d接口;
一个CCObject创建时加入自动释放池中,看下边源码可知
Sprite* Sprite::create(const std::string& filename)
{
Sprite *sprite = new (std::nothrow) Sprite();
if (sprite && sprite->initWithFile(filename))
{
sprite->autorelease();
return sprite;
}
CC_SAFE_DELETE(sprite);
return nullptr;
}
如果这个CCObject对象没有被其他类和容器retain过,那么它将自动释放,
例如:
auto sprite = Sprite::create();
layer->addChild(sprite);//如果没有这一步sprite将在消息循环的最后自动释放
此时sprite的生命周期持续到layer释放
这也是为什么不能在网络线层中管理CCObject生命周期,因为每一个UI的线程的最后,自动释放对象都会被删除,此时你在调用这些被删除的对象时就爆炸了
只有如下两种情况需要使用release()方法
当你new一个cocos2d::CCObject子类对象,如CCSprite,CCLayer等
Sprite *sprite = new (std::nothrow) Sprite();
当你得到cocos2d::CCObject子类对象的指针,你需要retain方法
使用静态构造函数
XXX::create() 是一个使用静态构造函数的例子,Cocos2d-x中所有得类,除了单例,都提供了静态构造函数,静态构造函数包含4步:
1. new 对象
2. object-> init()
3. object->autorelease()
4,return 对象
我们使用静态构造函数不需要在new,delete,autorelease,只要做好object->retain() 和object->release()