博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx进阶学习之CCObject
阅读量:4467 次
发布时间:2019-06-08

本文共 4677 字,大约阅读时间需要 15 分钟。

继承关系

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接口

转载于:https://www.cnblogs.com/new0801/p/6177234.html

你可能感兴趣的文章
npm和Node.js简介
查看>>
Spring AOP无法拦截Controller的原因
查看>>
Windows双系统
查看>>
Microsoft Project项目管理工具
查看>>
软件设计师-算法
查看>>
小米手机安装Google框架
查看>>
honpeyhonepy
查看>>
netaddr网络地址工具python
查看>>
OSI7层模型和网络排错、网络安全
查看>>
hash文件-对文件进行数字签名
查看>>
TCP_Wrappers基础知识介绍
查看>>
Central Post Office (Shiraz University Local Contest 2011 ) 树状dp
查看>>
51Nod - 1031 骨牌覆盖
查看>>
回顾环信使用
查看>>
JavaScript--函数对象的属性caller与callee
查看>>
特殊字符大全
查看>>
SQL - SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)[转]...
查看>>
《learning hard C#学习笔记》读书笔记(20)异步编程
查看>>
动态创建Struct实例
查看>>
Jsp通过JDBC连接到SQL Server2008数据库遇到的几个问题
查看>>