背景:
Cocos版本 :3.0alpha
语言 :C ++
问题:
在一个CCARRAY_FOREACH中,当从上一个周期删除一个Object时,它返回了错误的和重复的对象。
测试代码:
__Array* test = __Array::create();
test->retain();
Sprite *item1 = Sprite::create();
Sprite *item2 = Sprite::create();
Sprite *item3 = Sprite::create();
test->addObject(item1);
test->addObject(item2);
test->addObject(item3);
Object *it = NULL;
int index = 0;
CCARRAY_FOREACH(test, it)
{
log("[Enum] Index: %d Get: %X", index++, it);
}
it = NULL;
index = 0;
CCARRAY_FOREACH(test, it)
{
log("[Rmoved] Index: %d Get: %X", index++, it);
test->removeObject(it);
}
的输出:
[Enum]指数:0得到:90DFB88
[Enum]指数:1获取:90E0030
[Enum]指数:2获取:90E04D8
[Rmoved]指数:0得到:90DFB88
[Rmoved]指数:1获取: 90E04D8
[Rmoved]指数:2获取: 90E04D8
的问题:
我做错了吗?我和其他开发者一起检查了这些代码'发布在互联网上。看起来几乎一样。
我很好奇以前没有人遇到过这个问题。
如果没有,我们必须在使用 CCARRAY_FOREACH 时修补我们的代码中的这个漏洞?
答案 0 :(得分:0)
可能更好的解决方案应该使用std :: vector或cocos :: Vector。
Vector<Sprite*>* test = new Vector<Sprite*>();
Sprite *item1 = Sprite::create();
Sprite *item2 = Sprite::create();
Sprite *item3 = Sprite::create();
test->pushBack(item1);
test->pushBack(item2);
test->pushBack(item3);
int index = 0;
Vector<Sprite*>::iterator it = test->begin();
while (it != test->end())
{
log("[Enum] Index: %d Get: %X", index++, *it);
++it;
}
index = 0;
it = test->begin();
while(it != test->end())
{
log("[Rmoved] Index: %d Get: %X", index++, *it);
if(isRemovable)
{
it = test->erase(it);
}
else
{
++it;
}
}