Cocos2dx学习笔记35 CCArray使用注意事项

Cocos2dx学习笔记35 CCArray使用注意事项,第1张

概述在CCArray的头文件中定义了很多宏 (1)CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE          CCARRAY_FOREACH:从第一个元素开始遍历,如果要删除某个元素,后面的项往前移动,而该元素有两个一样的连续元素,那么第二个就被忽略掉,没有被处理。结果异常。          CCARRAY_FOREACH_REVERSE:从最后一个元素开始遍历

在CCArray的头文件中定义了很多宏

(1)CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE

CCARRAY_FOREACH:从第一个元素开始遍历,如果要删除某个元素,后面的项往前移动,而该元素有两个一样的连续元素,那么第二个就被忽略掉,没有被处理。结果异常。

CCARRAY_FOREACH_REVERSE:从最后一个元素开始遍历,如果要删除某个元素,结果正常。

(2)#define arrayMakeObjectsPerformSelector(pArray,func,elementType)

让数组中所有元素去执行某一个函数

(3)#define arrayMakeObjectsPerformSelectorWithObject(pArray,pObject,elementType)

让数组中所有元素去执行某一个函数,带参数


原文:http://blog.csdn.net/huanghuanghbc/article/details/25335369

CCArray是从cocos2d中移植过来的,类似于Apple的NSMutableArray,但是比NSMutableArray更为的好用。要注意的是虽然CCArray和CCDictionary可以管理cocos2d-x中绝大多数的类,但是仍然无法替代STL库,STL库更为强有力。


1.API

先看一下CCArray可以帮我们做什么。

1.1.创建@H_502_81@

1 2 3 4 5 6 7 8 9 10 //创建array static CCArray* create(); //使用一系列CCObject创建array CCArray* create(CCObject* pObject,…); //使用一个CCObject创建array CCArray* createWithObject(CCObject* pObject); //创建array并设置容量 CCArray* createWithCapacity(unsigned int capacity); //用一个已存在的array创建另一个array CCArray* createWithArray(CCArray* otherArray);

1.2.添加@H_502_81@ 6 //添加一个元素 voID addobject(CCObject* object); //添加一个已存在array中所有元素 addobjectsFromArray(CCArray* otherArray); //在指定位置插入元素 insertObject(CCObject* object,unsigned @H_301_207@index); 1.3.删除@H_502_81@ 10 11 12 13 14 //移除最后一个元素 removeLastObject( bool bReleaSEObj = true ); //移除某个元素 removeObject(CCObject* object, @H_301_207@); //移除一个指定位置的元素 removeObjectAtIndex(unsigned @H_301_207@index,monospace!important; Font-size:1em!important; min-height:inherit!important">); //移除某个array removeObjectsInArray(CCArray* otherArray); //移除所有元素 removeAllObjects(); //快速移除某个元素 fastRemoveObject(CCObject* object); //快速移除某个指定位置的元素 fastRemoveObjectAtIndex(unsigned 1.4. *** 作元素@H_502_81@ 14 15 16 //返回元素个数 unsigned @H_301_207@count() const ; //返回array容量 capacity() ; //返回指定CCObject的位置,如果不存在返回UINT_MAX indexOfObject(CCObject* object) ; //返回指定位置的CCObject CCObject* objectAtIndex(unsigned @H_301_207@index); //返回最后一个元素 CCObject* lastObject(); //返回随机元素 CCObject* randomObject(); //返回某个元素是否存在于array中 @H_301_207@containsObject(CCObject* object) ; //判断array是否相等 @H_301_207@isEqualToArray(CCArray* pOtherArray); 1.5. *** 作array内容@H_502_81@ //交换2个元素 exchangeObject(CCObject* object1,CCObject* object2); //交换2个指定位置元素 exchangeObjectAtIndex(unsigned @H_301_207@index1,monospace!important; Font-size:1em!important; min-height:inherit!important">index2); //用一个对象替代指定位置元素 replaceObjectAtIndex(unsigned @H_301_207@uIndex,CCObject* pObject,monospace!important; Font-size:1em!important; min-height:inherit!important">bReleaSEObject = //反转array reverSEObjects(); //收缩array内存以匹配元素个数 reduceMemoryFootprint();
2.remove和fastremove

从1.3可以看出删除有两种方式,普通删除和快速删除,它们有什么区别呢?


2.1.普通删除@H_502_81@ 16 17 18 19 //普通删除 ccArrayRemoveObjectAtIndex(ccArray *arr,monospace!important; Font-size:1em!important; min-height:inherit!important">bReleaSEObj /* = true*/ ) { CCAssert(arr && arr->num > 0 && index < arr->num, "InvalID index. Out of bounds" ); //删除元素内容,位置仍保留着 if (bReleaSEObj) { CC_SAFE_RELEASE(arr->arr[index]); } //长度减1 arr->num--; //获得要删除的元素后的元素个数 remaining = arr->num - index; (remaining>0) { //将要删除元素后的所有元素逐个向前移动 memmove (( *)&arr->arr[index],( *)&arr->arr[index+1],remaining * sizeof (CCObject*)); } } @H_419_590@ 2.2.快速删除@H_502_81@ //快速删除 ccArrayFastRemoveObjectAtIndex(ccArray *arr,monospace!important; Font-size:1em!important; min-height:inherit!important">index) //删除元素内容,位置仍保留着 CC_SAFE_RELEASE(arr->arr[index]); //获取最后一个元素 last = --arr->num; //把最后一个元素插到删除元素的位置上 arr->arr[index] = arr->arr[last]; 2.3.总结@H_502_81@


如果有array={0,1,2,3,4,5},如果要删除3,使用普通删除得到的结果{0,5},使用快速删除得到的结果是{0,5,4}。可以看出快速删除的效率比普通删除效率高,就差在移动元素的时间复杂度上。

3.内存分配

3.1.容量和个数@H_502_81@

CCArray中容量和个数并不是同一个概念。个数<=容量。从添加元素的源码中可以看到在添加之前会先进行空间分配,所以它是一个动态分配内存的过程。如下

7 ccArrayEnsureExtraCapacity(ccArray *arr,monospace!important; Font-size:1em!important; min-height:inherit!important">extra) //确保有额外的空间 { while (arr->max < arr->num + extra) //判断空间是否足够 { ccArrayDoubleCapacity(arr); //增加一倍空间 } }

所以,每次CCArray在插入数据时检测到空间不足会增加一倍空间,再进行检测,直到空间满足分配为止。


@H_419_590@ 3.2.判等@H_502_81@

判断2个CCArray是否相等使用isEqualToArray(),判断相等的条件是CCArray中的每个元素相等即可,与CCArray的容量无关。

4.效率

比起NSMutableArray,CCArray效率能高出10%左右,原因有三:

(1)它使用的是C接口,所以它不有Objective-C消息开销。

(2)它假定你知道你在做什么,所以它不花时间在安全检查上(如边界溢出,空间需求等)。

(3)在比较上使用了指针而不是isEqual。

除了CCArray,我们还看到了ccCArray,CCArray基本上都是调用了ccCArray的函数,为什么要分为2种?

仔细看一下CCArray是继承于CCObject,所以CCArray是用于处理cocos2d-x对象的,内存管理上也有cocos2d-x的autorelease等诸多特性。而ccCArray可以直接 *** 作标准的C数据结构和类型。

5.CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE

宏定义,用于正向遍历和反向遍历CCArray元素

11 #define CCARRAY_FOREACH(__array__,__object__) \ ((__array__) && (__array__)->data->num > 0) \ for (CCObject** __arr__ = (__array__)->data->arr,**__end__ = (__array__)->data->arr + (__array__)->data->num-1; \ __arr__ <= __end__ && (((__object__) = *__arr__) != NulL /* || true*/ ); \ __arr__++) #define CCARRAY_FOREACH_REVERSE(__array__,__object__) \ ((__array__) && (__array__)->data->num > 0) \ (CCObject** __arr__ = (__array__)->data->arr + (__array__)->data->num-1,**__end__ = (__array__)->data->arr; \ __arr__ >= __end__ && (((__object__) = *__arr__) != NulL ); \ __arr__--) 6.示例

CCArray的使用示例在http://www.jb51.cc/article/p-wfbmoohn-ep.html此文中有比较典型的应用,这里就不再详述。

7.注意

一般来说,CCArray不会被add到其他类,所以它的引用计数是1,而且被设置为自动释放。所以创建CCArray对象时要记得调用retain,而且在析构的时候也要调用release来释放内存。真心想吐槽。。。

总结

以上是内存溢出为你收集整理的Cocos2dx学习笔记35 CCArray使用注意事项全部内容,希望文章能够帮你解决Cocos2dx学习笔记35 CCArray使用注意事项所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1015914.html

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

发表评论

登录后才能评论

评论列表(0条)