前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cocos2D-x 3.5 引擎解析之–引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)

cocos2D-x 3.5 引擎解析之–引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)

作者头像
全栈程序员站长
发布2022-07-07 16:36:15
3090
发布2022-07-07 16:36:15
举报

大家好,又见面了,我是全栈君。

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

};

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116596.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档