class CC_DLL Ref
{
public:
// 将引用计数加1
void retain()
{
++_referenceCount;
}
// 将引用技术减1,如果引用计数为0,释放当前对象
void release()
{
--_referenceCount;
if (_referenceCount == 0)
{
delete this;
}
}
// 将当前对象加入到当前的自动回收池中
Ref* autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject(this);
return this;
}
unsigned int getReferenceCount() const
{
return _referenceCount;
}
protected:
Ref()
: _referenceCount(1) // when the Ref is created, the reference count of it is 1
{}
public:
virtual ~Ref();
protected:
/// count of references
unsigned int _referenceCount;
friend class AutoreleasePool;
};
1)auto sprite = new Sprite;
2)auto sprite = Sprite::create();
Object *Object::create()
{
Object *obj = new Object;
if (obj && obj->init())
{
obj->autorelease();
}
else
{
delete obj;
obj = nullptr;
}
return obj;
}
// main.cpp
return Application::getInstance()->run();
// Appdelegate.cpp
int Application::run()
{
...
while(!glview->windowShouldClose())
{
QueryPerformanceCounter(&nNow);
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
// Enter loop
director->mainLoop();
glview->pollEvents();
}
else
{
Sleep(0);
}
}
...
}
// CCDirector.cpp
void DisplayLinkDirector::mainLoop()
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
}
else if (! _invalid)
{
drawScene();
// release the objects
PoolManager::getInstance()->getCurrentPool()->clear();
}
}
// CCAutoReleasePool.cpp
void AutoreleasePool::clear()
{
for (const auto &obj : _managedObjectArray)
{
obj->release();
}
_managedObjectArray.clear(); // std::vector<cocos2d::Ref *> 类型的数组
}
原文地址:http://blog.csdn.net/xiaohui_hubei/article/details/39718511