在 Cocos CCARRAY_FOREACH 中删除一个对象时出现问题

Problems occurs when removed one object within Cocos CCARRAY_FOREACH

背景:

  1. Cocos 版本: 3.0alpha

  2. 语言: C++

问题:

在一个 CCARRAY_FOREACH 内,当从上一个循环中删除一个对象时,它返回了错误和重复的对象。

测试码:

__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);
}

输出:

[枚举] 索引:0 获取:90DFB88

[枚举] 索引:1 获取:90E0030

[枚举] 索引:2 获取:90E04D8

[Rmoved] 索引:0 得到:90DFB88

[Rmoved] 索引:1 获取:90E04D8

[Rmoved] 索引:2 获取:90E04D8

问题

我做错了什么吗?我检查了其他开发人员在互联网上发布的代码。看起来几乎一样。

我很好奇之前没有人遇到过这个问题。

如果不是,我们必须在使用 CCARRAY_FOREACH?

时修补代码中的这个漏洞

可能更好的解决方案应该使用 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;
    }
}