Objective c 重新启动游戏时EXC_访问错误
多年来一直试图解决这个错误,希望这里的人能帮上忙!:- 我正在使用Cocos2d和Objective-C,并有一个简单的游戏。我刚刚添加了一个“重新启动游戏”按钮,它会将您带回主菜单,以便您可以选择开始新游戏。问题是我在重新开始游戏时获得了EXC_BAD_访问权限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
[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的代码吗?这些方法是否会改变任何全局变量?我已经添加了您要求的代码和全局变量,谢谢您的时间