在 Cocos CCARRAY_FOREACH 中删除一个对象时出现问题
Problems occurs when removed one object within Cocos CCARRAY_FOREACH
背景:
Cocos 版本: 3.0alpha
语言: 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;
}
}
背景:
Cocos 版本: 3.0alpha
语言: 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;
}
}