Я делаю приложение для iphone, используя cocos2d, и я пытаюсь найти лучший подход для удаления элементов из NSmutableArray и из слоя одновременно.Под этим я подразумеваю, что объекты в массиве наследуются от ccNode и содержат ccsprite, который я добавил как дочерний элемент для cclayer.Приведенный ниже код находится в cclayer, который имеет nsmutablearray, называемый bonusicons.
-(void) AddNewBonusIcon: (int) colour :(int) pos{
BonusIcon *newbonus;
CGSize winSize = [[CCDirector sharedDirector] winSize];
int maxX = winSize.width;
int maxY = winSize.height;
int posX, posY;
newbonus = [[BonusIcon alloc] init];
[newbonus setBonusColour: colour];
int bonusOffset = 0;
posX = anchorX;
posY = anchorY;
bonusOffset = [bonusIcons count]*([newbonus.bonus_sprite boundingBox].size.width/2 + 12);
newbonus.bonus_sprite.position = ccp(posX+bonusOffset,posY);
[newbonus.bonus_sprite setTag:pos];
[self addChild:newbonus.bonus_sprite];
[bonusIcons addObject:newbonus ];
[newbonus release];
}
Это похоже на то, что я хочу, чтобы добавить спрайт объектов на экран и добавить объекты в nsmutablearray.Теперь, конечно, это, вероятно, не правильный способ сделать это, так что кричите на меня, если нет!
Далее я пытаюсь удалить объекты из массива и с экрана.Я могу удалить их из массива без проблем, я просто делаю следующее
for (int i = INITIAL_BONUSES-1; i>=0; i--) {
[bonusIcons removeObjectAtIndex:i];
}
это, конечно, оставляет спрайты на экране.так как мне приблизиться к тому, что я пытаюсь сделать, чтобы я мог удалить как спрайты с экрана, так и объекты из массива, с которым связан спрайт.Я могу удалить спрайты с экрана, используя теги и набрав
[self removeChildByTag: i cleanup: YES];но тогда я получаю ошибки при попытке удалить элементы из массива.я предполагаю, потому что я уже удалил часть объекта, и dealloc ccnode больше не может найти спрайт для освобождения?поэтому любые указания / советы и т. д. о том, как я должен делать это будет высоко ценится.Я прочитал кучу материала об управлении памятью, который, как мне кажется, является моей текущей проблемой, но я просто не понимаю, как это правильно.спасибо всем
редактировать: хорошо, так как после публикации я удалил спрайт освобождение от самого ccnode и добавил его к cclayer над ним.Это остановило сбой, так что я думаю, что я был прав с проблемой, которая у меня была.Я, конечно, не думаю, что способ, которым я решил, - это самый идеальный способ, но он будет работать, пока я не найду лучший путь.