继承关系

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

cocos2dx进阶学习之CCObject的更多相关文章

  1. cocos2dx进阶学习之场景切换

    背景 在学习马里奥时,我们学习到从菜单场景到游戏场景的切换,代码如下 void CMMenuScene::OnStartCallBack( CCObject *pSender ) { CCDirect ...

  2. cocos2dx进阶学习之CCScene

    继承关系 CCScene -> CCNode -> CCObject CCScene抽象了一个场景的概念,类似舞台的一幕 函数 static CCScene *create(void); ...

  3. cocos2dx进阶学习之CCAction

    CCAction在cocos2dx中,抽象了节点的动作.它由CCObject派生,因此它不是渲染节点. 它经常的用法是,创建一个action,然后让某个CCNode对象(一般是精灵),去执行它. 在马 ...

  4. cocos2dx进阶学习之CCNode

    继承关系 CCNode  -> CCObject CCNode在cocos2dx中抽象舞台对象,需要渲染的对象都是从CCNode派生,包括CCScene,CCLayer,CCSprite等等 C ...

  5. cocos2dx进阶学习之CCDirector

    继承关系 CCDirecotor -> CCObject, TypeInfo 处理主窗口消息,管理何时.何种方式执行场景. 经常被翻译成导演,负责管理整个游戏的进程推动和周边支持. 成员 inl ...

  6. cocos2dx进阶学习之屏幕适配

    背景 在学习cocos2dx时,我们在main函数中发现一句代码, #include "main.h" #include "AppDelegate.h" #in ...

  7. cocos2dx进阶学习之CCEGLView

    继承关系 CCEGLView-> CCEGLViewProtocol CCEGLView是窗口,在不同平台上有不同的实现,而CCEGLViewProtocol是CCEGLView定义的接口,所以 ...

  8. cocos2dx进阶学习之瓦片地图编辑器

    之前学习了瓦片地图类,现在我们来学习下瓦片地图制作工具 这个是开源的工具,可以从网上下载,下面我们演示下怎么做地图 步骤1 将需要用到的图片放到一个目录下,比如我机器上就是d:\tiled,这些图片是 ...

  9. cocos2dx进阶学习之CCTMXTiledMap

    继承关系 CCTMXTiledMap -> CCNode 它由CCNode派生,我们已经知道CCNode是cocos2dx的舞台对象的公共父类,所以CCTMXTiledMap也是个舞台对象 成员 ...

随机推荐

  1. Win32 SecuritySetting

    http://flylib.com/books/en/2.21.1.207/1/ http://blogs.technet.com/b/heyscriptingguy/archive/2011/11/ ...

  2. 百度云世界里的“七种武器”:PCS、BAE、Site App、ScreenX等

    如果说去年百度世界的关键词是“百度新首页”的话,那么今年在研发者人群中,对百度世界最深的印象就是“七种武器”,即在云的世界里,百度为开发者所提供的包括个人云存储.LBS.移动云测试中心等在内的七种工具 ...

  3. 查看LINUX系统版本和硬件信息

    查看发行版本 # cat /etc/issue Red Hat Enterprise Linux Server release 6.2 (Santiago) 查看内核 # uname -a Linux ...

  4. java学习之坦克大战游戏

    总结:由于这几天快过年比较忙然后没怎么写,写代码途中一些经验总结现在给忘记了.这次的小项目感觉比上次写的思路清楚了点.没有之前第一次写那么逻辑混乱,结构也搞的比之前的要好,添加功能比较容易.学习了之前 ...

  5. Intersecting Lines(数学)

    Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12844   Accepted: 57 ...

  6. 测试横竖屏切换时activity 的生命周期

    对于这个面试题,相信大家都见过,网上给出的答案是: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设 ...

  7. 讲讲金融业务(一)--自助结算终端POS

    之前在群里和大家聊天的时候,发现好多人对银行业务比較感兴趣,或许是由于大家对银行不了解,以为非常神奇的样子.全部,从这周開始我打算把我肚子里的墨水慢慢地倒出来,和大家分享分享.   在技术还不发达的时 ...

  8. 如何在自己的Activity中去控制EditText的焦点

    在进入一个Activity时,如果这个Activity中有EditText,则这个EditText会自动获取焦点,然后就会弹出软键盘,这样给用户体验不是很好.所以一般会通过代码控制让EditText不 ...

  9. DevExpress ASP.NET 使用经验谈(7)-ASPxTreeList控件使用

    这一节,将介绍ASPxTreeList控件的使用,首先,我们增加一个标准地址库表AddressGB, 建表语句如下: CREATE TABLE [dbo].[AddressGB]( [Code] [v ...

  10. if语句判断身高体重是否标准

    1.判断身高,体重是否标准 Console.WriteLine("请输入您的身高:"); int sg = Convert.ToInt32(Console.ReadLine()); ...