-- 不要怕,勇敢的迈出第一步,加油!!!!!--
此章介绍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. 不能在组件的继承类中保存任何成员变量的对象,谨记。