class CC_DLL CCCopying
{
public:
virtual CCObject* copyWithZone(CCZone* pZone);
};
class CC_DLL CCZone
{
public:
CCZone(CCObject *pObject = NULL); public:
CCObject *m_pCopyObject;
};

CCCopying 类是最简单的一个类了。

只有一个构造函数,用CCZone初始化一个CCobject

只是相当于一个接口的作用。

再看看CCZone类的定义

只有一个CCObject* m_pCopyObject;

主要用来保存CCObject对象的。

可以看看CCZone的构造函数

 CCZone::CCZone(CCObject *pObject)
{
m_pCopyObject = pObject;
}

可以看到,只是保存了CCObject的对象,CCZone中人是为了CCObject子类之间拷贝作用的。

比如CCAction::copyWithZone(CCZone *pZone) 的实现,代码如下:

CCObject* CCAction::copyWithZone(CCZone *pZone)
{
CCZone *pNewZone = NULL;
CCAction *pRet = NULL;
if (pZone && pZone->m_pCopyObject)
{
pRet = (CCAction*)(pZone->m_pCopyObject);//这一句,可以看到,CCZone只是方便拷贝使用的。
}
else
{
pRet = new CCAction();
pNewZone = new CCZone(pRet);
}
//copy member data
pRet->m_nTag = m_nTag;
CC_SAFE_DELETE(pNewZone);
return pRet;
}

CCObject继承自CCopying,CCObject有两个功能。提供了引用计数,主要用来进行内存管理的。又分为手动内存管理和自动内存管理。

看下CCObject类的定义

 class CC_DLL CCObject : public CCCopying
{
public: //这两个是支持lua等脚本语言用的,可以先不用管
unsigned int m_uID; .
int m_nLuaID;
protected:
unsigned int m_uReference; //对象的引用计数的
unsigned int m_uAutoReleaseCount;//自动内存管理的
public:
CCObject(void);
virtual ~CCObject(void);
void release(void); // 自减1 , m_uReference == 0时,delete this,销毁自己
void retain(void); // 自增1 , m_uReference++ ;
CCObject* autorelease(void); // 自动内存管理的。CCPoolManager::sharedPoolManager()->addObject(this);CCPoolManager是个内存池管理的
CCObject* copy(void); // CCObject的拷贝机制,内存就一句代码 return copyWithZone(0); ,可见,是调用了copyWithZone
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; // 把CCAutoreleasePool设为CCObject的友元类,是为了方便CCAutoreleasePool访问CCObject中的成员进而进行内存管理
};

相应的CCObject实现代码如下,可以参照上面的注释进行理解

 CCObject* CCCopying::copyWithZone(CCZone *pZone)
{
CC_UNUSED_PARAM(pZone);
CCAssert(, "not implement");
return ;
} CCObject::CCObject(void)
: m_nLuaID()
, m_uReference() // when the object is created, the reference count of it is 1
, m_uAutoReleaseCount()
{
static unsigned int uObjectCount = ; m_uID = ++uObjectCount;
} CCObject::~CCObject(void)
{
// if the object is managed, we should remove it
// from pool manager
if (m_uAutoReleaseCount > )
{
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);
}
}
} CCObject* CCObject::copy()
{
return copyWithZone();
} void CCObject::release(void)
{
CCAssert(m_uReference > , "reference count should greater than 0");
--m_uReference; if (m_uReference == )
{
delete this;
}
} void CCObject::retain(void)
{
CCAssert(m_uReference > , "reference count should greater than 0"); ++m_uReference;
} CCObject* CCObject::autorelease(void)
{
CCPoolManager::sharedPoolManager()->addObject(this);
return this;
} bool CCObject::isSingleReference(void) const
{
return m_uReference == ;
} unsigned int CCObject::retainCount(void) const
{
return m_uReference;
} bool CCObject::isEqual(const CCObject *pObject)
{
return this == pObject;
} void CCObject::acceptVisitor(CCDataVisitor &visitor)
{
visitor.visitObject(this);
}

另外介绍3个宏,分别是NS_CC_BEGIN ,NS_CC_END ,USING_NS_CC

定义分别如下

#define NS_CC_BEGIN namespace cocos2d {
#define NS_CC_END }

#define USING_NS_CC     using namespace cocos2d

通过定义可以得知,前面两个宏的其实就是用来进行命名空间的声明的。

namespace cocos2d{

// here your code

}

第3个宏,是在使用 using namespace cocos2d 时可以用USING_NS_CC  代替,个人觉得完全没有必要,直接写觉得更好。

今天就写到这,写的不完善,还请见谅

												

cocos2d-x源码分析(1)的更多相关文章

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  8. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  9. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  10. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

随机推荐

  1. IOS框架研究之SDWebImage的原理以及使用流程

    SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. SDWebImage 支持异步的图片下载+ ...

  2. OAF_JDBC系列2 - 通过JDBC连接SQLSERVER数据库DriverManager.getConnection

    d try{          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");          St ...

  3. overfitting过拟合

    来自:https://www.zhihu.com/question/32246256 其实不完全是噪声和假规律会造成过拟合. (1)打个形象的比方,给一群天鹅让机器来学习天鹅的特征,经过训练后,知道了 ...

  4. Celery 和 Redis 入门

    Celery 是一个广泛应用于网络应用程序的任务处理系统. 它可以在以下情况下使用: 在请求响应周期中做网络调用.服务器应当立即响应任何网络请求.如果在请求响应周期内需要进行网络调用,则应在周期外完成 ...

  5. ORM框架

    半自动:iBATIS是一个半自动化的ORM框架,需要通过配置方式指定映射SQL语句 全自:由框架本身生成(如Hibernate自动生成对应SQL来持久化对象),即Hibernate属于全自动ORM框架 ...

  6. 16. Copy List with Random Pointer

    类同:剑指 Offer 题目汇总索引第26题 Copy List with Random Pointer A linked list is given such that each node cont ...

  7. 【VB.NET】类绑定控件,实现文本框快捷键全选

    Public Class KeyBinder Public Sub BindControl(ByRef CControl As TextBox) AddHandler CControl.KeyDown ...

  8. android开发之单选按钮

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  9. delphi 怎么获取工程版本号

    function GetApplicationVersion:String; // Added 取得程序版本号 var FileName:String; InfoSize,Wnd:DWORD; Ver ...

  10. Ibatis 测试出SQL

    String sql = Brg.Global.Map.BaseBatis.GetRuntimeSql("select_T_JewelleryProductType", _Mode ...