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个人认为作用是不太大的,大家权当了解就好
- cocos2d-x源码分析::CCCopying关于浅拷贝和深拷贝
- 关于深拷贝和浅拷贝(原创)
- iOS:关于浅拷贝和深拷贝
- 关于深拷贝和浅拷贝
- 关于深拷贝和浅拷贝
- 关于浅拷贝和深拷贝
- 关于Cocos2d-x资源拷贝问题
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- jstl标签集合及应用实例总结
- 二、Git手册--基本的快照功能(翻译自http://gitref.org/)
- jsp九大内置对象
- hdu1159 Common Subsequence
- ElasticSearch reference manual
- cocos2d-x源码分析::CCCopying关于浅拷贝和深拷贝
- 学习hibernate不可绕过的两个问题
- android 反射的应用
- linux中select()函数分析
- ConcurrentHashMap
- 编译VLC2.0.7
- sgu 103 Traffic Lights 最短路径
- Insert Interval
- Android layout adaptive to mutiply density screen