Программа получила сигнал: «EXC_BAD_ACCESS» - PullRequest
0 голосов
/ 22 июня 2010

Я пишу код, используя cocos2d. Я хочу освободить всю память, которую я выделил. Я сделал это в методе dealloc следующим образом.
Все объекты, которые я выпустил, объявлены в файле интерфейса, а свойство (assign) установлено и синтезировано в файле реализации.
Я использовал метод alloc для их создания, например

self.PlayerA = [[CCSprite alloc] initWithFile:@" PlayerImage_01.png"];


-(void)dealloc
{
 int count , i ;

 count = [self.PlayerA retainCount];
 for(i = 0; i < count; i++)
   [self.PlayerA release];

 count = [self.targetLayer retainCount];
 for(i = 0; i < count; i++)
   [self.targetLayer release];

  count = [self.playerGunSlowDrawSheet retainCount];
 for(i = 0; i < count; i++)
    [self.playerGunSlowDrawSheet release];

 count = [self.playerGunSlowDrawAnimation retainCount];
 for(i = 0; i < count; i++)
    [self.playerGunSlowDrawAnimation release];

 count = [self.numberFinishedTime retainCount];
 for(i = 0; i < count; i++)
    [self.numberFinishedTime release];

 count = [self.backGroundImage retainCount];
 for(i = 0; i < count; i++)
   [self.backGroundImage release];

 [[CCTextureCache sharedTextureCache] removeAllTextures];
 [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];

 [super dealloc];
 }

Но я получаю: Программа получила сигнал: «EXC_BAD_ACCESS». Я отладчик показывает ошибку в [super dealloc];

Я совершенно не прав в управлении памятью? Или я что-то упустил в этом. Спасибо.

1 Ответ

1 голос
/ 22 июня 2010

Да, это не хороший способ освободить объекты. Выпуская объект A несколько раз в вашем методе dealloc (если он сохраняет count> 1), вы потенциально вытаскиваете коврик из-под любого другого объекта, который может использовать объект.

Вы должны освобождать объект только один раз (при условии, что вы сохраняете объект только один раз или выделяете его самостоятельно), если вы им владеете.

Для получения дополнительной информации о «владении» объектами я рекомендую прочитать Руководство по программированию управления памятью Apple по адресу:

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Использование элемента Build and Analyze в меню Build вашего XCode должно помочь в поиске подобных проблем, если вы поймете основы управления памятью Objective-C

Как правило, метод dealloc должен выглядеть следующим образом:

-(void) dealloc
{
    [self.objectA release];
    [self.objectB release];

    [super dealloc];
}

edit: Чтобы ответить на ваш первоначальный вопрос о том, почему вы получаете EXC_BAD_ACCESS, здесь недостаточно информации, чтобы определить, почему. Одной из возможных причин может быть то, что вы освобождаете объект в вашем подклассе, который также освобождается в методе dealloc вашего суперкласса. Но это всего лишь выстрел в темноте

...