欢迎转帖: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