您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x内存管理机制详解

2014-10-10 09:32 309 查看
本篇文章纯粹是自己在写木头的卡牌塔防的时候遇到问题的时候,才萌发心思了解关于cocos2d-x的内存管理机制;

1.首先要想让对象参与内存管理机制,必须要继承Ref类(Node,Layer,等都继承了该类);

2.调用对象的autoRelease函数,对象就会被cocos2d-x内存管理机制给盯上,并且是在游戏的每一帧都被盯上,没人认领则将其杀死;

3.如果不想其被杀死,则就要调用retain函数,这样就被认领了,这样就永远不会被杀死,问题来了,如果永远不被杀死,则就要造成了内存泄露,则需要调用release函数

4.addChild函数会调用retain函数。

问题来了:

什么时候调用retain函数?什么时候调用release函数?

解释:

当你把一个对象作为成员变量时,并且没有把对象的addChild到另外一个对象中,就需要调用retain函数。

切记,必须调用了该对象的autoRelease函数之后,才可以使用release和retain;

关于内存管理总结起来有4 个原则。

1.‰‰谁创建,谁释放。使用 new 构造出来的函数引用计数为 1,需要调用 release 或者delete 释放,Cocos2D-X 中封装的create 函数中的步骤是先调用new 构造出来一个对象,因为要符合“谁创建,谁释放”的原则,而create 函数需要返回这个对象,不能 自己释放自己创建的对象,所以要调用autorelease 将对象放入自动释放池。也就是说create 出来的对象,如果不调用retain 函数,那么下一帧(再次调用update
时)这个对象已经被自动释放。

‰‰ 2. 谁需要保留谁释放。当一个对象被其他指针需要的时候该指针进行保留操作(retain),当不需要时进行release 释放。需要注意的是,addChild 中已经调用了retain 函数,所以创建的Node 节点,不需要retain,直接传递给addChild 被加在父节点上就可以保留了。

‰‰ 3.传递赋值时,需要先 retain 形参,后 release 原指针,最后赋值。

‰‰ 4.自动释放池 PoolManager。将对象置于自动释放池中,每帧绘制结束,就自动释放池中的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: