内存管理机制
// CCObject都成员变量m_uReference表示一个用来控制生命周期都引用计数器
// retainCount()方法获得对象当前都引用计数值
// obj对象被创建
obj->init();
CCLog("retainCount after init: %d", obj->retainCount());
// 引用对象,计数器加1
obj->retain();
CCLog("retainCount after retain: %d", obj->retainCount());
// 引用计数值减1,释放该对象的引用权
obj->release();
CCLog("retainCount after release: %d", obj->retainCount());
// 将对象放入自动回收池中,当回收池自身被释放当时候,就会对池中所有对对象执行一次release()方法,实现灵活的垃圾回收
// 回收池可以手动创建和释放,在每一帧结束的时候,自动回收池中的对象也会被执行一次release()方法
obj->autorelease();
CCLog("retainCount after autorelease: %d", obj->retainCount());
控制台结果:
Cocos2d: retainCount after init: 1
Cocos2d: retainCount after retain: 2
Cocos2d: retainCount after release: 1
Cocos2d: retainCount after autorelease: 1
回收池的创建和释放
CCSprite *obj1 = new CCSprite();
CCSprite *obj2 = new CCSprite();
CCSprite *obj3 = new CCSprite();
CCSprite *objaa = new CCSprite();
CCSprite *objbb = new CCSprite();
obj1->init();
obj2->init();
obj3->init();
objaa->init();
objbb->init();
CCLog("retainCount after init: %d %d %d %d %d", obj1->retainCount(), obj2->retainCount(), obj3->retainCount(), objaa->retainCount(), objbb->retainCount());
// 系统开始就创建了一个回收池1,将obj1,obj2放入
obj1->autorelease();
obj2->autorelease();
CCLog("retainCount after obj1,obj2 autorelease: %d %d %d %d %d", obj1->retainCount(), obj2->retainCount(), obj3->retainCount(), objaa->retainCount(), objbb->retainCount());
// 手动创建回收池2,压入嵌套池栈中
CCPoolManager::sharedPoolManager()->push();
// 手动创建回收池3,压入嵌套池栈中
CCPoolManager::sharedPoolManager()->push();
// 将objaa和objbb一同放入手动创建的回收池3中
objaa->autorelease();
objbb->autorelease();
CCLog("retainCount after objaa,objbb autorelease: %d %d %d %d %d", obj1->retainCount(), obj2->retainCount(), obj3->retainCount(), objaa->retainCount(), objbb->retainCount());
// 手动删除自己创建的回收池3,弹出嵌套池栈,objaa和obj22调用一次release()方法
CCPoolManager::sharedPoolManager()->pop();
CCLog("retainCount after pop: %d %d %d %d %d", obj1->retainCount(), obj2->retainCount(), obj3->retainCount(), objaa->retainCount(), objbb->retainCount());
// 将obj3一同放入手动创建的回收池3中
obj3->autorelease();
// 手动删除自己创建的回收池2,弹出嵌套池栈,obj3调用一次release()方法
CCPoolManager::sharedPoolManager()->pop();
CCLog("retainCount after obj3 autorelease: %d %d %d %d %d", obj1->retainCount(), obj2->retainCount(), obj3->retainCount(), objaa->retainCount(), objbb->retainCount());
控制台结果:
Cocos2d: retainCount after init: 1 1 1 1 1
Cocos2d: retainCount after obj1,obj2 autorelease: 1 1 1 1 1
Cocos2d: retainCount after objaa,objbb autorelease: 1 1 1 1 1
Cocos2d: retainCount after pop: 1 1 1 0 0
Cocos2d: retainCount after obj3 autorelease: 1 1 0 0 0
内存管理宏
//使用delete删除一个对象
#define CC_SAFE_DELETE(p) do { if(p) { delete (p); (p) = 0; } } while(0)
//使用delete[]删除一个数组
#define CC_SAFE_DELETE_ARRAY(p) do { if(p) { delete[] (p); (p) = 0; } } while(0)
//使用free()函数删除对象
#define CC_SAFE_FREE(p) do { if(p) { free(p); (p) = 0; } } while(0)
//使用release()方法释放Cocos2d-x对象的一次引用
#define CC_SAFE_RELEASE(p) do { if(p) { (p)->release(); } } while(0)
//使用release()方法释放Cocos2d-x对象p的一次引用,再把p赋值为null。如果p已经为null,则不进行操作
#define CC_SAFE_RELEASE_NULL(p) do { if(p) { (p)->release(); (p) = 0; } } while(0)
//使用reatin()方法增加Cocos2d-x对象p的一次引用。如果p为null,则不进行操作
#define CC_SAFE_RETAIN(p) do { if(p) { (p)->retain(); } } while(0)
//是否传入对象为true,如果为true则不执行后面的代码
#define CC_BREAK_IF(cond) if(cond) break