#include <CCRef.h>
Ref is used for reference count manangement. If a classinherits from Ref.
Class Ref 为引用计数类,用来管理对象的引用计数。
这样就不会出现还有指针保持指向该对象,当使用该指针操作时,假设指向的对象被销毁就会出现程序异常。
class
CC_DLL Ref
{
public:
void
retain();//添加引用计数一次
void
release();//降低引用计数一次,假设此时引用计数为零,使用AutoreleasePoolManager释放内存
Ref*
autorelease();//把当前对象增加到自己主动释放池中。使之成为一个可使用引用计数的对象
比如:
PhysicsBody*
PhysicsBody::create()
{
PhysicsBody*
body = new (std::nothrow)
PhysicsBody();
if (body &&
body->init())
{
body->autorelease();//此处使用autorelease把body增加到自己主动释放池,就能够使body成为一个能够被引用计数的对象
return body;
}
CC_SAFE_DELETE(body);
return
nullptr;
}
unsigned
int getReferenceCount()
const;//返回引用计数值
protected:
Ref();//初始化引用计数为1
public:
virtual ~Ref();
protected:
unsigned
int _referenceCount;//引用计数
friend
class AutoreleasePool//自己主动释放池友元类
};
PoolManager为资源池管理器。管理着一个自己主动释放池的vector。採用的是单例模式设计的。也就是说仅仅同意一个PoolManager对象。
#include <CCAutoreleasePool.h>
class
CC_DLL PoolManager
{
public:
CC_DEPRECATED_ATTRIBUTE
static PoolManager*
sharedPoolManager() {
return getInstance(); }//static 方法返回单例对象的指针
static
PoolManager* getInstance();//使用该函数返回一个单例对象的指针,此处会检查s_singleInstance是否为空,为空就new一个PoolManager对象
CC_DEPRECATED_ATTRIBUTE
static void
purgePoolManager() { destroyInstance(); }//析构PoolManager指针
static
void destroyInstance();
AutoreleasePool *getCurrentPool()
const;//返回vector中最后一个自己主动释放池对象
bool
isObjectInPools(Ref* obj)
const;//检查自己主动释放池中是否有obj对象
friend
class AutoreleasePool;//设置自己主动释放池为友元类
private:
PoolManager();//构造函数。初始化vector能够包括十个自己主动释放池
~PoolManager();
void
push(AutoreleasePool *pool);//把pool从back增加到vector
void
pop();//弹出vector中back元素
static
PoolManager* s_singleInstance;//单例对象指针,设置为私有元素
std::vector<AutoreleasePool*>
_releasePoolStack;//该类管理的自己主动释放池vector
};
自己主动释放池管理着一个引用计数对象的vector,而且每一个自己主动释放池有自己的名字
#include <CCAutoreleasePool.h>
class
CC_DLL AutoreleasePool
{
public:
AutoreleasePool();//构造函数,初始化自己主动释放池名字为空,vector容量为150
AutoreleasePool(const
std::string &name); //构造函数,初始化自己主动释放池名字为name,vector容量为150
~AutoreleasePool();//析构函数
void
addObject(Ref *object);//把object对象从back增加到vector中
void
clear();//清空vector
bool
contains(Ref* object)
const;//检查vector中是否含有object对象
void
dump();
private:
std::vector<Ref*>
_managedObjectArray;//vector对象
std::string
_name;//自己主动释放池的名字
};