欢迎转帖: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(); }
再来看下该宏的实现部分:
#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__++)
这个宏很实用,但是如果在对children遍历的过程中,对CCArray的数据进行了修改(比如增删),那么这个宏可能会发生致命的错误,本人就经历了这样的错误,debug了很久才发觉是这个宏的原因~
本人在dosomething的时候,往CCArray里面添加了CCNode对象,然后导致了错误~
所以总结一下,使用该宏的时候要确保,中间的过程没有对CCArray进行增删,动态数组遇到这样的问题很常见,大家注意点~
欢迎转帖:http://blog.csdn.net/wolfking_2009/article/details/9731785