Cocos2d-x使用的内存管理方式是引用计数,引用计数是一种很有效的机制,通过给每个对象维护一个引用计数器,记录该对象当前被引用的次数。当对象增加一次引用时,计数器加1;而对象失去一次引用时,计数器减1;当引用计数为0时,标志着该对象的生命周期结束,自动触发对象的回收释放。引用计数的重要规则是每一个程序片段必须负责任地维护引用计数,在需要维持对象生存的程序段的开始和结束分别增加和减少一次引用计数,这样就可以实现十分灵活的内存管理。
接下来看一下Cocos2d-x 3.1 版本的源码是怎么实现引用计数的。
一、Ref
我们都知道几乎每个类都继承一个类Ref,打开CCRef.h查看Ref类,去掉其它与引用计数无关的,可以简化为:
- //CCRef.h
- classCC_DLLRef
- {
- public:
- voidretain();//引用计数加1
- voidrelease();//引用计数减1
- Ref*autorelease();//将对象交给自动释放池
- unsignedintgetReferenceCount()const;//获取当前的引用计数
- protected:
- Ref();//构造函数,这里的权限为protected,说明自己不能实例化,子类可以实例化
- virtual~Ref();
- unsignedint_referenceCount;//引用计数
- friendclassAutoreleasePool;//这个先别管
- };
- //CCRef.cpp
- Ref::Ref():_referenceCount(1)//new一个对象时,引用计数加1
- }
- Ref::~Ref()
- voidRef::retain()
- CCASSERT(_referenceCount>0,"referencecountshouldgreaterthan0");
- ++_referenceCount;
- voidRef::release()
- --_referenceCount;
- if(_referenceCount==0)//引用为0时说明没有调用该对象,此时delete对象
- {
- deletethis;
- }
- Ref*Ref::autorelease()
- PoolManager::getInstance()->getCurrentPool()->addObject(this);//交给自动释放池管理
- returnthis;
- intRef::getReferenceCount()const
- return_referenceCount;
- }