热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cocos2dx进阶学习之CCObject

继承关系CCObject->CCCopying类定义classCC_DLLCCObject:publicCCCopying{public:objectid,CCS
继承关系

CCObject -> CCCopying


类定义

class CC_DLL CCObject : public CCCopying{
public:
// object id, CCScriptSupport need public m_uID
unsigned int m_uID;
// Lua reference id
int m_nLuaID;
protected:
// count of references
unsigned int m_uReference;
// count of autorelease
unsigned int m_uAutoReleaseCount;
public:
CCObject(void);
/**
* @lua NA
*/
virtual ~CCObject(void);

void release(void);
void retain(void);
CCObject* autorelease(void);
CCObject* copy(void);
bool isSingleReference(void) const;
unsigned int retainCount(void) const;
virtual bool isEqual(const CCObject* pObject);

virtual void acceptVisitor(CCDataVisitor &visitor);

virtual void update(float dt) {CC_UNUSED_PARAM(dt);};

friend class CCAutoreleasePool;
};
成员解释

变量

unsigned int m_uID;

对象ID,由CCObject管理的全局唯一对象ID,用于CCScriptSupport类。每生成一个CCObject或者其子类对象,id自动增长1。


int m_nLuaID;

LuaID,从名字上看就知道是Lua脚本使用的ID,该ID由CCObject定义,但是CCObject并不管理该ID,由LuaCocos2d模块使用。


unsigned int m_uReference;

对象计数器,构造时为1,当调用对象的release成员函数时,这个值将自减,如果减少到0,那么对象被自己删除。


unsigned int m_uAutoReleaseCount;

调用autorelease的次数记录,初始化为0,调用一次自增1,用于析构函数检查是否需要从对象池中清除自身。

函数

CCObject(void);

构造函数,主要的功能是将成员函数初始化。

构造函数实现中,用一个静态变量来管理m_uID。

CCObject::CCObject(void): m_nLuaID(0), m_uReference(1) // when the object is created, the reference count of it is 1, m_uAutoReleaseCount(0){    static unsigned int uObjectCount = 0;    m_uID = ++uObjectCount;}


virtual ~CCObject(void);

析构函数,主要的功能是清除该对象与对象池、脚本对象管理之间的关系

CCObject::~CCObject(void){    // if the object is managed, we should remove it    // from pool manager    if (m_uAutoReleaseCount > 0)    {        CCPoolManager::sharedPoolManager()->removeObject(this);    }    // if the object is referenced by Lua engine, remove it    if (m_nLuaID)    {        CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCObject(this);    }    else    {        CCScriptEngineProtocol* pEngine = CCScriptEngineManager::sharedManager()->getScriptEngine();        if (pEngine != NULL && pEngine->getScriptType() == kScriptTypeJavascript)        {            pEngine->removeScriptObjectByCCObject(this);        }    }}


void release(void);

release函数被调用时,计数器减一,如果计数器到0,那么

void CCObject::release(void){    CCAssert(m_uReference > 0, "reference count should greater than 0");    --m_uReference;    if (m_uReference == 0)    {        delete this;    }}


void retain(void);

增加计数器,保证对象不被删除

void CCObject::retain(void){    CCAssert(m_uReference > 0, "reference count should greater than 0");    ++m_uReference;}



CCObject* autorelease(void);

让对象池管理器管理本对象,这样程序员可以不用去delete该对象内存

CCObject* CCObject::autorelease(void){    CCPoolManager::sharedPoolManager()->addObject(this);    return this;}


CCObject* copy(void);

对象拷贝,这里调用了CCCopying的copyWithZone,那么copy也是和CCCopying一样没有做任何事情,拷贝工作还是需要子类做具体的实现,这里只是留有接口罢了

CCObject* CCObject::copy(){    return copyWithZone(0);}


bool isSingleReference(void) const;

这个函数只是简单判断m_uReference是否为1而已

bool CCObject::isSingleReference(void) const{    return m_uReference == 1;}


unsigned int retainCount(void) const;

返回引用个数

unsigned int CCObject::retainCount(void) const{    return m_uReference;}


virtual bool isEqual(const CCObject* pObject);

判断是否相等

bool CCObject::isEqual(const CCObject *pObject){    return this == pObject;}


virtual void acceptVisitor(CCDataVisitor& visitor);

接受一个CCDataVisitor,可以通过该接口实现序列化等工作

void CCObject::acceptVisitor(CCDataVisitor &visitor){    visitor.visitObject(this);}


virtual void update(float dt) ;

更新函数,CCObject没有实现,只是预留接口

virtual void update(float dt) {CC_UNUSED_PARAM(dt);};

其他非成员相关

typedef void (CCObject::*SEL_SCHEDULE)(float);typedef void (CCObject::*SEL_CallFunc)();typedef void (CCObject::*SEL_CallFuncN)(CCNode*);typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*);typedef void (CCObject::*SEL_CallFuncO)(CCObject*);typedef void (CCObject::*SEL_MenuHandler)(CCObject*);typedef void (CCObject::*SEL_EventHandler)(CCEvent*);typedef int (CCObject::*SEL_Compare)(CCObject*);#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)#define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)#define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)#define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)#define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)#define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)#define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)

以上宏,定义成员函数指针类型,用于schedule回调指针


总结

CCObject作为cocos2dx中大部分类的父类,提供了

1)内存管理功能

2)为脚本提供对象ID管理

3)序列化接口

4)提供update接口


推荐阅读
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 学习笔记17:Opencv处理调整图片亮度和对比度
    一、理论基础在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式:在图像像素中其中:参数f(x)表示源图像像素。参数g(x)表示输出图像像素。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • Ansibleplaybook roles安装redis实例(学习笔记二十九)
    1、相关redis参数:2、templatesredis.conf配置相关参数:daemonizeyespidfilevarrunredis_{{red ... [详细]
author-avatar
手机用户2602889575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有