码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2d-x的引用计数机制

时间:2015-11-27 13:00:01      阅读:507      评论:0      收藏:0      [点我收藏+]

标签:

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()

 

cocos2d-x的引用计数机制

标签:

原文地址:http://www.cnblogs.com/Xiaoshun/p/5000187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!