cocos2d-x的引用计数机制

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

 

转载于:https://www.cnblogs.com/Xiaoshun/p/5000187.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值