cocos 采用的是引用计数管理,自动释放
1. new 一个Ref对象,pObj 的引用计数为1
2.调用了autoRelease 将该对象(pObje)的地址添加到PoolManager::getInstance()->getCurrentPool 中
3.在Pool 中使用vector<Ref*>来保存
4.当Director在下一帧处理渲染的时候,先drawScene,然后clear全部的Pool中的Ref对象
内部的Ref对象的引用计数都会自动-1
我们以一个Sprite为例来说明
Sprite *pSprite = Sprite::create(“png file”);
create方法完成两件事情
1.new Sprite
2.将pSprite对象放在Pool里面
此时pSprite的引用计数为1
3.通常我们会将pSprite对象放在一个父Node容器中,加入放在了一个Layer中
addChild(pSprite)
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->...
}