Возвращение перечисления ivar вызывает EXC_BAD_ACCESS - PullRequest
0 голосов
/ 29 января 2012

Я пишу игру, в которой класс MainGameplay отслеживает, чей это ход, установив для значения ivar значение enum:

typedef enum {
  GAME_NOT_STARTED,
  PLAYER_1_TO_MOVE,
  PLAYER_2_TO_MOVE
} WhoseTurnIsIt;

Затем класс GameBoard проверяет, является ли попытка перемещения допустимой,и вызывает turnEnded:(WhoseTurnIsIt)turn или reportTurnFailure:(WhoseTurnIsIt)turn в MainGameplay.m.

Я получаю EXC_BAD_ACCESS, как только я пытаюсь получить доступ к этому возвращенному значению обратно в MainGameplay, в методах получения.Похоже, я должен сохранить что-то, но вы не можете сохранить перечисление.В отладчике есть значения, поэтому я не понимаю, к чему обращаются неправильно.

Это код, выполняющий вызов в GameBoard:

-(void)buttonPressed:(id)sender {
  CCArray *kids = [[[CCDirector sharedDirector] runningScene] children];
  if (!mainScene) { // mainScene is an ivar on each the GameBoard's buttons.
    for (CCScene *s in kids) {
      // this looks crazy because the "main" scene is actually a controlling layer that has as a child the main gameplay layer:
      if ([s isKindOfClass:[ControlLayer class]]) {
        self->mainScene = (MainGameplay *)((ControlLayer *) s).gameLayer;
      }
    }
  }

  if (MOVE_NO_ERROR == [self checkMove:mainScene.turn]) {
    [self setMove:mainScene.turn];
    [mainScene turnEnded:mainScene.turn]; // This line and the next are the ones causing the EXC_BAD_ACCESS
  } else [mainScene reportTurnFailure:mainScene.turn]; // This line too.
}

EDIT Функции в вызываемой mainScene выглядят так:

-(void) reportTurnFailure:(WhoseTurnIsIt)_turn {
  NSLog(@"MainScene still valid"); // This line works fine
  NSLog(@"Bzzzzzt. Player %@, try again", _turn); // This line crashes BUT _turn shows up with a proper value in the debugger.
}

1 Ответ

2 голосов
/ 29 января 2012

_turn не является объектом, но спецификатор формата %@ говорит, что аргумент является объектом. Вместо этого используйте %i.

-(void) reportTurnFailure:(WhoseTurnIsIt)_turn {
  NSLog(@"MainScene still valid"); // This line works fine
  NSLog(@"Bzzzzzt. Player %i, try again", _turn); // This line crashes BUT _turn shows up with a proper value in the debugger.
}
...