在Cocos CCARRAY_FOREACH

时间:2017-12-05 23:08:49

标签: c++ enums cocos2d-x-3.0

背景

  1. Cocos版本 :3.0alpha

  2. 语言 :C ++

  3. 问题

    在一个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 时修补我们的代码中的这个漏洞?

1 个答案:

答案 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;
    }
}