У меня возникли проблемы с удалением элементов из std::list
, содержащих объект CCNode
. XCode дает мне следующую ошибку при попытке установить erase()
a элемент:Удаление CCNode из std :: list вызывает ошибку в XCode
error: address doesn't contain a section that points to a section in a object file
.
Или эта ошибка:
EXC_BAD_ACCESS code=2
в файле сборки.
А иногда он выходит из строя на:
ccGLBindTexture2D(m_pobTexture->getName());
дает мне EXC_BAD_ACCESS.
Каждый раз, когда я запускаю приложение, я получаю одну из этих ошибок.
Метод remove() корректно удаляет CCNode из CCLayer, он исчезает, а количество узлов уменьшается на единицу. Проблема в том, что TestObject по-прежнему остается в списке testList, едя память, процессор и испортить игру.
Я написал тестовый пример, чтобы воспроизвести проблему. Вот оно:
testList = *new list<TestObject>;
testList.push_back(*new TestObject());
addChild(&testList.back());
testList.back().spawn();
testList.back().remove();
std::list<TestObject>::iterator test = testList.begin();
while (test != testList.end())
{
if(test->isRemoved){
testList.erase(test++);
}
}
TestObject класс просто CCNode со следующими remove()
и spawn()
методов добавил:
TestObject::TestObject(){
sprite = *CCSprite::createWithTexture(MainScene::hostileship_tex);
}
void TestObject::spawn(){
CCSize size = sprite.getTexture()->getContentSize();
this->setContentSize(size);
this->addChild(&sprite);
}
void TestObject::remove(){
GameLayer::getInstance().removeChild(this, true);
}
StackTrace XCode дает мне просто перечисляет пару внутреннего обновления и визуализации функций cocos2dx, не давая мне понять, что вызывает крушение.
Спасибо! В конце концов я решил проблему, используя вектор, чтобы отслеживать теги CCNodes. Используя методы addChild (узел CCNode, int zIndex, int tag) и getChildByTagName (int tag), я мог вставлять и получать объекты из родительского CCLayer. Однако ваш совет поможет. –