Программа получила сигнал: «EXC_BAD_ACCESS»

Я пишу код с помощью 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];

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


person srikanth rongali    schedule 22.06.2010    source источник


Ответы (1)


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

person AlexC    schedule 22.06.2010
comment
Но я читал, что сколько раз мы выделяем память, столько раз мы должны освобождать. Итак, я сделал это. Я пройду по ссылке, которую вы разместили. Спасибо. - person srikanth rongali; 22.06.2010
comment
Srikanth - да, объект должен быть освобожден столько раз, сколько он был сохранен (или выделен). Однако простое многократное освобождение объекта приводит к поражению точки подсчета ссылок - как вы, по сути, говорите, мне все равно, сколько раз на него ссылаются, просто освободите память, используемую этим объектом. Представьте себе случай, когда у вас есть A, B и Z. Оба A и B ссылаются на Z. Вы создаете Z, затем A, затем B. Итак, теперь счетчик ссылок Z равен 2. Затем вы отпускаете A и вызываете его освобождение. Затем он дважды отпустит Z, и Z будет освобожден. Если затем B попытается использовать Z, это не удастся. - person AlexC; 23.06.2010