[cocos2dx]重要父类——CCObject对象类

[cocos2dx]重要父类——CCObject对象类,第1张

概述CCObject CCObject.h: #ifndef __CCOBJECT_H__#define __CCOBJECT_H__#include "platform/CCPlatformMacros.h"//Cocos2d命名空间NS_CC_BEGIN//声明以下几种类,在后面会定义相应类的成员变量的指针。以下几个类均是CCObject类的派生类。class CCZone; / 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派生出CCObjectclass 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

CCObject作为cocos2dx中大部分类的父类,提供了内存管理功能;为脚本提供对象ID管理;序列化接口;

总结

以上是内存溢出为你收集整理的[cocos2dx]重要父类——CCObject对象类全部内容,希望文章能够帮你解决[cocos2dx]重要父类——CCObject对象类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1056199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存