Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2D-x 3.5 引擎解析之--引用计数(Ref),自动释放池(PoolManager),自动释放池管理器( AutoreleasePool)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

#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;//自动释放池的名字

};

大佬总结

以上是大佬教程为你收集整理的cocos2D-x 3.5 引擎解析之--引用计数(Ref),自动释放池(PoolManager),自动释放池管理器( AutoreleasePool)全部内容,希望文章能够帮你解决cocos2D-x 3.5 引擎解析之--引用计数(Ref),自动释放池(PoolManager),自动释放池管理器( AutoreleasePool)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。