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