cocos2D-x 3.5 引擎解析之--引用计数(Ref),自动释放池(PoolManager),自动释放池

  次阅读 作者:智能小宝 来源:互联网 2015-09-28 11:20 我要评论(0)

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

#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

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...