CCObject
CCObject.h:
#ifndef __CCOBJECT_H__ #define __CCOBJECT_H__ #include "platform/CCPlatformMacros.h" //Cocos2d命名空间 NS_CC_BEGIN //声明以下几种类,在后面会定义相应类的成员变量的指针。以下几个类均是CCObject类的派生类。 class CCZone; //CCObject指针暂存类 class CCObject;//基类 class CCNode; //结点类 class CCEvent; //事件类 //这里定义了一个拷贝类 class CC_DLL CCCopying { public: //虚函数。功能是为CCZone指针所指向的对象复制一份新的CCObject对象指针 virtual CCObject* copyWithZone(CCZone* pZone); }; //由CCCopying派生出CCObject class CC_DLL CCObject : public CCCopying { public: // 唯一ID unsigned int m_uID; // 在LUA脚本引擎中的访问标识ID.暂可不理会,待学习到LUA时再分析 int m_nLuaID; protected: // 引用计数器,进行内存计数。 unsigned int m_uReference; // 是否是被内存管理器进行托管而自动进行释放。 bool m_bManaged; public: //构造函数 CCObject(void); //析构函数 virtual ~CCObject(void); //释放 void release(void); //保留 void retain(void); //设置实例对象的释放由内存管理器进行管理。实现自动释放。 CCObject* autorelease(void); //取得一个拷贝 CCObject* copy(void); //本类的实例化对象是否只有一个使用者 bool isSingleRefrence(void); //返回内存计数器的值,也就是取得使用者的个数 unsigned int retainCount(void); //判断是否与另一个CCObject实例对象相同 virtual bool isEqual(const CCObject* pObject); //更新函数 virtual void update(ccTime dt) {CC_UNUSED_PARAM(dt);}; //设定CAutoreleasePool为友元类,这是一个通过CCObject指针容器CCMutableArray来对CCObject实例对象的内存进行管理的类,CCMutableArray在加入CCObject时对其引用计数器加1,在移除CCObject时对其引用计数器减1。 friend class CCAutoreleasePool; }; //定义一些函数 //定义定时器访问类成员函数 typedef void (CCObject::*SEL_SCHEDULE)(ccTime); //定义普通回调类成员函数 typedef void (CCObject::*SEL_CallFunc)(); //定义带结点参数的回调类成函数 typedef void (CCObject::*SEL_CallFuncN)(CCNode*); //定义带结点参数及1个用户值参数的回调类成员函数 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*); //定义一些宏来取得这些回调成员函数的指针。 #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) NC_CC_END #endif // __CCOBJECT_H_CCObject.cpp:
#include "CCObject.h" //内存管理器头文件 #include "CCAutoreleasePool.h" //Cocos2d-x定义的一些宏的头文件 #include "ccMacros.h" //加入脚本支持 #include "scripte_support/CCScriptSupport.h" NS_CC_BEGIN //虚函数。这里简单处理一下。需要进行重载 CCObject* CCCopying::copyWithZone(CCZone *pZone) { CC_UNUSED_PARAM(pZone); //如果不进行重载,则会提示没有重载实现函数功能。 CCAssert(0,"not implement"); return 0; } //构造 CCObject::CCObject(void) { //定义一个静态UINT类型变量做为实例对象计数器,此值只会增长,不会减少,保证唯一。 static unsigned int uObjectCount = 0; //将计数器加1后赋值给唯一ID。 //注意:所有由此CCObject类派生的子类也会拥有这个唯一的ID。它可以使我们通过唯一ID来获取相应的实例对象。 m_uID = ++uObjectCount; //脚本ID m_nLuaID = 0; // 当类进行实例化时,将m_uReference设为1 m_uReference = 1; //初始化时设实例化对象由用户进行内存管理。如果new出一个对象,需要自行delete。 m_bManaged = false; } //析构 CCObject::~CCObject(void) { 如果内存是由内存管理器统一管理,则调用内存管理器实例对象的移除函数对自已的内存进行释放。 if (m_bManaged) { CCPoolManager::getInstance()->removeObject(this); } //如果有使用到LUA脚本,调用脚本引擎的实例对象的移除函数将本身从脚本引擎的实例对象中移除。 if (m_nLuaID) { CCScriptEngineManager::sharedManager()->getScriptEngine()->removeCCObjectByID(m_nLuaID); } } //返回一个本类实例化对象的拷贝 CCObject* CCObject::copy() { return copyWithZone(0); } //供使用者外部调用的释放函数 void CCObject::release(void) { //先确保计数器是大于0的数值,说明正常有效 CCAssert(m_uReference > 0,"reference count should greater than 0"); //计数器减1 --m_uReference; //如果计数器减为0,释放本类实例化对象占用的内存 if (m_uReference == 0) { delete this; } } //使用者外部调用的,使用一次时更新计数器。 void CCObject::retain(void) { CCAssert(m_uReference > 0,"reference count should greater than 0"); ++m_uReference; } //设置当前类的实例化对象的内存管理交给内存管理器去管理,不手动进行内存计数器的处理。 CCObject* CCObject::autorelease(void) { //调用内存管理器实例对象的addObject函数加入当前CCObject实例对象的指针 CCPoolManager::getInstance()->addObject(this); //打开使用内存管理器的标记 m_bManaged = true; return this; } //是否当前类的实例化对象只被一个使用者使用 bool CCObject::isSingleRefrence(void) { //计数器的个数即代表使用者的个数,因为一个使用者使用一次,计数器加1 return m_uReference == 1; } //返回当前类的实例化对象的使用者的个数 unsigned int CCObject::retainCount(void) { return m_uReference; } //是否与另一个基类为CCObject的实例化对象是同一个对象 bool CCObject::isEqual(const CCObject *pObject) { return this == pObject; } NS_CC_END