欢迎转帖:http://blog.csdn.net/wolfking_2009/article/details/9731785

CCArray这个是在cocos2d-x当中很常用的,其基类是CCObject,主要是作为存储CCObject指针的容器来使用的。最常用的地方是存储CCNode及其子类的children。CCNode在cocos2d-x当中的重要性不言而喻,而其children也是要经常要被操作的~一般在遍历CCNode的children的时候,会使用一个宏CCARRAY_FOREACH。该宏简化了遍历写法。主要写法如下:

CCArray * pChildrenArray = this->getChildren();
			
			CCLayer* child = NULL;
			CCObject* pObject = NULL;
			CCARRAY_FOREACH(pChildrenArray, pObject)
			{
				child = (CCLayer*)pObject;
				if(!child)
					break;
				child->dosomething();
			}

可以看出,这个宏在对children进行集体操作的时候十分有用,也很简便。但是这样的简便却有可能让你踏入陷阱当中。

再来看下该宏的实现部分:

#define CCARRAY_FOREACH(__array__, __object__)                                                                         \
    if ((__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__++)

可以看出其是使用指针的指针来实现的,首先CCObject** __arr__ = (__array__)->data->arr获取arrary中第一个CCObject对象指针的指针,__end__即为获取最后一个。__arr__++意为每次,二级指针++,该指针指向后一个指针,就是下一个CCObject指针的指针。__arr__<= __end__确定指针范围。__object__ = *__arr__,将__arr__所指向的CCObjec指针赋值给__object__。

这个宏很实用,但是如果在对children遍历的过程中,对CCArray的数据进行了修改(比如增删),那么这个宏可能会发生致命的错误,本人就经历了这样的错误,debug了很久才发觉是这个宏的原因~

本人在dosomething的时候,往CCArray里面添加了CCNode对象,然后导致了错误~

所以总结一下,使用该宏的时候要确保,中间的过程没有对CCArray进行增删,动态数组遇到这样的问题很常见,大家注意点~

欢迎转帖:http://blog.csdn.net/wolfking_2009/article/details/9731785

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐