cocos2D-x 3.5 引擎解析之--引用计数(Ref),自动释放池(PoolM
#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 classAutoreleasePool//自动释放池友元类 }; PoolManager为资源池管理器,管理着一个自动释放池的vector。采用的是单例模式设计的,也就是说只允许一个PoolManager对象。 #include <CCAutoreleasePool.h> class 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 { public:
AutoreleasePool();//构造函数,初始化自动释放池名字为空,vector容量为150
AutoreleasePool(const 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: Ref*> _managedObjectArray;//vector对象 string _name;//自动释放池的名字
}; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |