04-内存管理

cocos 采用的是引用计数管理,自动释放

Image(2)

1. new 一个Ref对象,pObj 的引用计数为1

2.调用了autoRelease 将该对象(pObje)的地址添加到PoolManager::getInstance()->getCurrentPool 中

3.在Pool 中使用vector<Ref*>来保存

4.当Director在下一帧处理渲染的时候,先drawScene,然后clear全部的Pool中的Ref对象

Image(3)

内部的Ref对象的引用计数都会自动-1

我们以一个Sprite为例来说明

Sprite *pSprite = Sprite::create(“png file”);

create方法完成两件事情

1.new Sprite

2.将pSprite对象放在Pool里面

此时pSprite的引用计数为1

3.通常我们会将pSprite对象放在一个父Node容器中,加入放在了一个Layer中

addChild(pSprite)

Image(4)

Vector<Node*> _children;

最终在Node中添加在了_children中,此时pSprite的引用计数为2

因为在Vector中的pushBack中 调用了 Ref对象的retain方法

4.此时在下一帧的时候,当然先调用了drawScene

将该Sprite渲染出来,然后调用了Pool的clear方法,针对一个单独的Ref来说,也就是调用了release方法,此时pSprite的引用计数变为1

5.pSprite对象已经不存在于Pool中了,所以帧循环中就不涉及pSprite对象的引用计数改变了

6.当pSprite的父对象Node自我销毁的时候,执行完毕pSprite父对象的release过程后,pSprite父对象中的 Vector<Node*> _children; 会自动调用clear方法

也就是找到每一个子对象,然后调用其release方法,所以该方法执行到 pSprite->release的时候

pSprite对象的引用计数变为0 ,所以自己将被delete

对于一帧中局部需要new Ref的对象,并且又希望局部使用完毕被释放掉的时候,可以在局部方法中如下方式:

{

     AutoreleasePool pTmpPool;

          for ...

               Ref* pNewObj = ...

               pNewObj->...

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值