EXC_BAD_ACCESS при перезапуске игры - PullRequest
0 голосов
/ 26 февраля 2012

Давно пытаюсь решить эту ошибку, надеясь, что кто-то здесь может помочь! : -)

Я использую Cocos2d с Objective-C и имею простую игру. Я только что добавил кнопку «Перезапустить игру», которая возвращает вас в главное меню, чтобы вы могли начать новую игру. Проблема в том, что я получаю EXC_BAD_ACCESS после перезапуска игры.

   [self performSelector:@selector(drawone) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawtwo) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawthree) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawfour) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawfive) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawsix) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawseven) withObject:nil afterDelay:3];
     [self performSelector:@selector(draweight) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawnine) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawten) withObject:nil afterDelay:3];

Я запускаю приведенный выше код в 'init', и это приводит к сбою игры во второй игре до конца в линии

-(void)drawone {

Однако, если я хочу закомментировать некоторые из приведенного выше кода, например,

  [self performSelector:@selector(drawone) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawtwo) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawthree) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawfour) withObject:nil afterDelay:3];
    [self performSelector:@selector(drawfive) withObject:nil afterDelay:3];

     /* [self performSelector:@selector(drawsix) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawseven) withObject:nil afterDelay:3];
     [self performSelector:@selector(draweight) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawnine) withObject:nil afterDelay:3]; */

     [self performSelector:@selector(drawten) withObject:nil afterDelay:3];

Затем я получаю EXC_BAD_ACCESS на - (void) на этот раз (все еще на второй игре)

В заключение, комментируя больше кода, например,

    [self performSelector:@selector(drawone) withObject:nil afterDelay:3];

    /*  [self performSelector:@selector(drawtwo) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawthree) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawfour) withObject:nil afterDelay:3];
    [self performSelector:@selector(drawfive) withObject:nil afterDelay:3];
    [self performSelector:@selector(drawsix) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawseven) withObject:nil afterDelay:3];
     [self performSelector:@selector(draweight) withObject:nil afterDelay:3];
     [self performSelector:@selector(drawnine) withObject:nil afterDelay:3]; */

     [self performSelector:@selector(drawten) withObject:nil afterDelay:3];

И он доходит до 6-го воспроизведения (вы можете перезапустить его 5 раз), прежде чем получить EXC_BAD_ACCESS на - (void) drawone

Тот факт, что EXC_BAD_ACCESS меняет местами, и когда он появляется, заставляет меня предположить, что нет проблемы в - (void) drawone, поскольку в некоторых случаях он будет запускаться без проблем. Я слышал, что использование зомби для отладки может помочь: после попытки, к сожалению, это не помогло. Я новичок в Objective-C, поэтому я прошу прощения, если это простая ошибка. Заранее спасибо.

Вот чертеж:

-(void)drawone
 {

onepos = (arc4random() % 10) + 1;


if(positions[(onepos - 1)] != 0)
{
    positions[(onepos - 1)] = 0;
    if(onepos == 1)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp(53,420);
        [self addChild:onem];

    }
    else if(onepos == 2)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 1)),420);
        [self addChild:onem];


    }
    else if(onepos == 3)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 2)),420);
        [self addChild:onem];


    }
    else if(onepos == 4)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp(53,300);
        [self addChild:onem];


    }
    else if(onepos == 5)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 1)),300);
        [self addChild:onem];


    }
    else if(onepos == 6)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 2)),300);
        [self addChild:onem];


    }
    else if(onepos == 7)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp(53,180);
        [self addChild:onem];


    }
    else if(onepos == 8)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 1)),180);
        [self addChild:onem];


    }
    else if(onepos == 9)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 2)),180);
        [self addChild:onem];


    }
    else if(onepos == 10)
    {
        CCMenuItemImage *one = [CCMenuItemImage itemFromNormalImage:@"one.png" selectedImage:@"onepressed.png"

                                                             target:self
                                                           selector:@selector(oneclick:)];

        onem = [CCMenu menuWithItems:one, nil];
        onem.positionInPixels = ccp((53 + (106 * 1)),60);
        [self addChild:onem];


    }

}
else
{

    [self drawone];

}

}

и у меня есть глобальные переменные:

int positions[] = {1,2,3,4,5,6,7,8,9,10};
int currentclick = 10; 
int onepos;
NSTimeInterval starttime;
CCMenu* onem;
CCMenu* twom;
CCMenu* threem;
CCMenu* fourm;
CCMenu* fivem;
CCMenu* sixm;
CCMenu* sevenm;
CCMenu* eightm;
CCMenu* ninem;
CCMenu* tenm;

Опять же, я новичок в Objective-C, поэтому, вероятно, делаю что-то действительно глупое

1 Ответ

0 голосов
/ 26 февраля 2012

Тот факт, что EXC_BAD_ACCESS меняет места и когда он появляется заставляет меня предположить, что нет проблем в - (void) drawone поскольку в некоторых случаях он запускается без проблем.

Это может или не может быть правдой. Тот факт, что ваш код не всегда дает сбой, не означает, что проблемы нет. EXC_BAD_ACCESS означает, что ваш код где-то получает неверный указатель. Похоже, в вашем коде есть неинициализированный указатель, и ваш код падает, когда этот указатель указывает на неверный адрес. Если указатель указывает на некоторый допустимый объект или содержит nil (любой из которых может легко произойти в результате значений, оставленных в стеке другими методами), то ваш код не потерпит крах.

Способ отладки состоит в том, чтобы заставить код аварийно завершить работу, а затем использовать отладчик для просмотра кода в точке, где произошел сбой. Посмотрите на переменные, которые используются в строке, вызвавшей исключение. Если сбой произошел в каком-то другом методе, который не принадлежит вам (где-то в фреймворке), создайте резервную копию стека, ищите первое место, где вы можете увидеть свой код, и проверьте это вместо этого.

...