Objective c 重新启动游戏时EXC_访问错误

Objective c 重新启动游戏时EXC_访问错误,objective-c,ios,xcode,exc-bad-access,Objective C,Ios,Xcode,Exc Bad Access,多年来一直试图解决这个错误,希望这里的人能帮上忙!:- 我正在使用Cocos2d和Objective-C,并有一个简单的游戏。我刚刚添加了一个“重新启动游戏”按钮,它会将您带回主菜单,以便您可以选择开始新游戏。问题是我在重新开始游戏时获得了EXC_BAD_访问权限 [self performSelector:@selector(drawone) withObject:nil afterDelay:3]; [self performSelector:@selector(drawtw

多年来一直试图解决这个错误,希望这里的人能帮上忙!:-

我正在使用Cocos2d和Objective-C,并有一个简单的游戏。我刚刚添加了一个“重新启动游戏”按钮,它会将您带回主菜单,以便您可以选择开始新游戏。问题是我在重新开始游戏时获得了EXC_BAD_访问权限

   [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];
    [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_访问权限,这次仍然是第二场比赛

最后,注释掉更多的代码,例如

  [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];
    [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次,然后才能在-voiddrawone上获得EXC_BAD_访问权限

EXC_BAD_访问改变了位置,当它出现时,我认为-voiddrawone中没有问题,因为在某些情况下,它会毫无问题地运行。我听说使用僵尸来调试它可能会有所帮助:在尝试之后,不幸的是它没有。我是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还不熟悉,所以我可能做了一些非常愚蠢的事情

EXC_BAD_访问的位置和时间会发生变化 这让我认为,在一个人身上没有问题 因为,在某些情况下,它会毫无问题地运行

这可能是真的,也可能不是真的。您的代码并不总是崩溃的事实并不意味着没有问题。EXC_BAD_ACCESS意味着您的代码正在访问某个地方的错误指针。听起来您的代码中有一个未初始化的指针,每当指针指向无效地址时,代码就会崩溃。如果指针恰好指向某个有效对象或包含nil,则其他方法留在堆栈上的值很容易导致其中任何一个,那么代码不会崩溃


调试的方法是让代码崩溃,然后使用调试器在崩溃发生时查看代码。查看导致异常的行上使用的变量。如果崩溃发生在框架中某个不属于您的方法中,请备份堆栈,寻找第一个可以查看代码的位置,并进行检查。

崩溃发生的位置在第二行,因此如果您的说法正确,我无法判断是哪些变量导致代码崩溃。如果有帮助的话,调试器会说“无法还原以前选择的帧”。在-drawone的第一行中放置一个断点,并在遇到该断点时逐步执行代码。另外,尝试将代码更改为直接调用-drawone,而不是使用-performSelector:。。。。一种可能性是,当drawone被调用时,self已经被释放和释放。你说直接调用它是什么意思?像[self-drawone]?@user1232480-是的,直接呼叫[self-drawone];[self draw two]。。。没有性能选择器。在Xcode中放置一个标记为蓝色的断点,并按照Caleb所说的操作。我们需要知道应用程序崩溃的位置和调试器消息。设置断点的问题是,问题出现在重新启动游戏时。断点会影响第一次运行,因此游戏永远不会进入“重新启动”屏幕:除非我缺少一些明显的功能,使我可以这样做。例如,你能分享draw one的代码吗?这些方法是否会改变任何全局变量?我已经添加了您要求的代码和全局变量,谢谢您的时间