cocos2d 内存管理
-- 不要怕,勇敢的迈出第一步,加油!!!!!--
此章介绍cocos2d 中的内存管理
1. cocos2d 中的所有Node类都继承于Ref,Ref中有引用计数的概念,如下: class TestRef : public Ref { public: TestRef() {} virtual ~TestRef() {} }; new TestRef -- 这时class Ref 中的_referenceCount = 1 retain -- _referenceCount++ release -- _referenceCount--,如果_referenceCount == 0,析构这个class autoRelease -- 把this 放入PoolManager 内存池中. 当PoolManager回收时,就会把这个class回收到,并且析构。
例子1 auto p = new TestRef(); _referenceCount = 1 p->retain(); _referenceCount = 2 p->release(); _referenceCount = 1 p->release(); _referenceCount = 0,析构p
例子2 auto p = new TestRef(); _referenceCount = 1 p->autoRelease(); 当PoolManager回收时,就会把这个class回收到,并且析构。
这个就是cocos2d 中的内存管理。 如果我们在使用一些sprite,layer,scene时,在addChild的前后,如果不是特殊需要,不要调用其retain或者release,因为在创建后,这个组件都调用了autoRelease,并在其父节点释放后,其子节点都会释放的。
2. 不要在组件的继承类中保存如何的非Node类的成员变量,什么意思呢?如下,这里只是简单的描述一下哈, class TestLayer : public layer { public: virtual ~TestLayer() { t->release(); } CREATE_FUNC(Fight); private: TestRef *t; };
bool TestLayer::init() { if (!Layer::init()) return false; t = new TestRef(); return true; } 把当前的TestLayer加入Scene中,然后程序退出,Scene和TestLayer都会被析构掉。在TestLayer的析构中,我们要把TestRef也析构掉,但是在TestLayer的析构函数断点中,我看到 t 是一个无效的指针,并且TestRef的析构函数没有被调用过,“内存泄露”了,怀疑如下:仅供个人参考,如果有人知道具体答案,请告知,谢谢~~~~ 在TestLayer析构之前,其内部的所有子组件都会被析构掉,并且其所有成员变量都被重置成野指针,这是什么原因,我还没有搞清楚,内存泄露,程序退出时就会挂掉,大家可以根据这个,判断其是否内存泄露,什么地方内存泄露,还是很有用的。
结论: 1. cocos2d 的内存管理有效的解决某些童鞋忘掉释放内存的习惯,当然这个习惯不好哈。 2. 不能在组件的继承类中保存任何成员变量的对象,谨记。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |