NSMutableArray и память dealloc - PullRequest
       4

NSMutableArray и память dealloc

0 голосов
/ 28 августа 2010

Я делаю приложение для 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 над ним.Это остановило сбой, так что я думаю, что я был прав с проблемой, которая у меня была.Я, конечно, не думаю, что способ, которым я решил, - это самый идеальный способ, но он будет работать, пока я не найду лучший путь.

1 Ответ

1 голос
/ 28 августа 2010

В коде, который вы опубликовали, его нет, но ваш вопрос, похоже, подразумевает, что вы звоните dealloc. Единственное место, которое вы должны вызывать dealloc, это [super dealloc] в конце dealloc метода класса. Неправильно вызывать его для чего угодно, кроме super или в любом другом месте, и это приведет к ошибкам в отношении преждевременно освобожденных объектов (потому что, ну, именно это он и делает).

Если это то, что вы делаете, я настоятельно рекомендую вам прочитать руководство по управлению памятью от Apple *1009*. В нем очень просто и подробно рассказывается о том, как работает управление памятью в Какао.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...