EXC_BAD_ACCESS на IPhone Cocos2d - PullRequest
0 голосов
/ 18 июля 2010

У меня есть следующий код:

-(void) changeAnimation:(NSString*)name forTime:(int) times {
 if(currentAnimation != @"attack")
 {
  id action = [CCAnimate actionWithAnimation:[self animationByName:name]];
  id repeatAction = [CCRepeat actionWithAction:action times:times];
  currentAction = [self runAction:repeatAction];
  lastANimation = currentAnimation;
  currentAnimation = name;
 }
 else if(currentAction.isDone)
 {
   //Here is where I would change the animation
   //but I commented the code for now
 }
}

Поэтому, когда я запускаю это и нажимаю на кнопку, которая изменяет анимацию на «атаку» (вызывая [mysprite changeAnimation: @ «attack» forTime: 1];), Я получаю ошибку EXC_BAD_ACCESS из строки «currentAction.isDone», при следующем вызове функции (джойстик вызовет changeAnimation, чтобы попытаться изменить анимацию на «run» или «idle», но я хочуанимация атаки, чтобы закончить первым).Есть мысли о том, почему я это понимаю?currentAction объявлен в моем классе.

Edit: в остальной части класса нет ничего, что взаимодействует с currentAction, кроме getter.Его объявление находится в формате .h (CCAction * surrentAction).Нужно ли его инициализировать?Я думал, что возвращенное значение из runAction будет достаточно?В любом случае, когда я запускаю отладчик, он не равен nil и ему назначено правильное действие.

Спасибо,

Дейв

Редактировать: в итоге я создал последовательность, когда«атакующий», вызывающий функцию, изменяющую currentAnimation, поэтому я избежал этой проблемы.До сих пор не знаю, что происходит.Вот ответ, если вы заинтересованы: Другое сообщение

1 Ответ

1 голос
/ 18 июля 2010

Вероятно, для правильного ответа на этот вопрос требуется больше класса, но обычно EXC_BAD_ACCESS происходит потому, что вы обращаетесь к чему-то, что было выпущено и больше не доступно в памяти.

Я предполагаю, что где-то в вашем классе вы выпускаете, явно или неявно, объект "currentAction" асинхронно - и когда вы проверяете позже, это делается и исчезает, и вы попадаете в этот сбой.

В целом, сохранение одной или двух переменных состояния, для которых у вас всегда есть известные значения, является хорошим способом для выполнения «действий», которые вы проходите, если они асинхронны и выполняют свое собственное управление памятью. оставьте их как таковые и проработайте некоторые переменные состояния, которые вы поддерживаете, и управляйте всем управлением памятью. Это довольно разумный шаблон для асинхронных обратных вызовов, либо с классическими вещами, либо когда вы переходите на использование блоков с iOS 4.0

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