cocos2d-x源码分析::CCCopying关于浅拷贝和深拷贝

来源:互联网 发布:sql 入门到精通 编辑:程序博客网 时间:2024/05/11 18:08

在讨论CCCopying这个类之前我们先来说一说浅拷贝和深拷贝的问题


在我看来,其实C++很少讨论关于浅拷贝和深拷贝的内容,我们可以看一下下面的代码

int main() {int *a = new int(10);int *b, *c;*b = *a; //深拷贝c = a;   //浅拷贝}

*a, *b和*c的值都是10,但是a和c的值与b不同,a和c指向共同的地址,b指向另一个地址,这就是深浅拷贝的区别


C++中大部分的类型,如整型,布尔型,浮点型都没有深浅拷贝的区别,只有指针,引用这些地址变量才有区别


对于Java和C#这些封装了指针操作的语言,用引用进行操作,调用赋值号操作符进行拷贝只能是浅拷贝,所以如果要进行深拷贝,必须根据新创建一个对象,再将新对象进行赋值


在Java中通过实现ICloneable可以进行深拷贝,而OC中就是NSCopying,而cocos2d-x是由cocos2d-iphone移植成C++的,所以理所当然就存在了CCCopying(最近新出了cocos2d-x3.0听说脱离了oc的风格,不过我没有详细去了解,这里大家有兴趣的话可以去看看)


一个类通过继承CCCopying,并覆写(override)其中的copyWithZone的方法,就可以实现深拷贝。


当然cocos2d-x已经通过CCObject继承了CCCopying,所以如果大家需要用深拷贝的时候,就只需要在一个CCObject子类覆写copyWithZone,然后通过调用方法copy(3.0改成clone)就能够实现深拷贝


我们现在就可以看一看cocos2d-x实现深拷贝的一些细节

//CCObject.cppCCObject* CCObject::copy(){    return copyWithZone(0);}

copy函数就是那么简单,把职责转交给了copyWithZone,这里的传入参数0,实际上应该是((void*)0),通常用宏NULL来表示


因为CCObject的copyWithZone是未实现的,我们就看一看CCAction的

//CCAction.cppCCObject* CCAction::copyWithZone(CCZone *pZone){    CCZone *pNewZone = NULL;    CCAction *pRet = NULL;    if (pZone && pZone->m_pCopyObject)    {        pRet = (CCAction*)(pZone->m_pCopyObject);    }    else    {        pRet = new CCAction();        pNewZone = new CCZone(pRet);    }    //copy member data    pRet->m_nTag = m_nTag;    CC_SAFE_DELETE(pNewZone);    return pRet;}

如果传入参数NULL,很明显是通过new,创建一个新的内存空间,然后再对成员变量进行拷贝,最后返回,这就是深拷贝的操作过程


其实在cocos2d-x这个引擎的C++框架中,这个CCCopying个人认为作用是不太大的,大家权当了解就好




原创粉丝点击