【发布时间】:2014-01-17 21:48:21
【问题描述】:
我使用 Objective-c / SpriteKit 在 Xcode 5 中制作了一个简单的 mac 应用程序,当我运行该应用程序时,它崩溃并在到达部分代码时产生错误。错误是:Error in objective-c: Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5f3ffff8)
我知道堆栈溢出时此错误有很多重复,但据我所知,每个实例都是多种多样的,解决方案仅与该示例相关。
这是我的代码中显示错误的代码段。 (这个完全相同的代码在我的代码的其他部分工作得很好):
-(void)singlePlayer {
double delayInSeconds = 1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(),^{ //ERROR appears here
SKNode *orbRoot = [self childNodeWithName:@"//ORB_ROOT"];
NSArray *allOrbs = [orbRoot children];
checkAccuracy = FALSE;
for(SKNode *eachOrb in allOrbs) {
if([eachOrb position].y >= 70 && [eachOrb position].y <= 130) {
int randomNumber = arc4random()%3+1;
switch (randomNumber) {
case 0:
break;
case 1:
// Shields
[orbOutline2 removeFromParent];
delayLargeOutline2 = TRUE;
xPos = 900;
yPos = 100;
CGPoint location = CGPointMake(xPos, yPos);
orbOutline2 = [SKSpriteNode spriteNodeWithImageNamed:@"shoot.rhythm orb outline"];
orbOutline2.position = location;
orbOutline2.scale = 0.1;
[self addChild:orbOutline2];
[player2Feedback removeFromParent];
[self addChild:[self player2FeedbackNode:@"Shields!"]];
delayPlayer2Feedback = TRUE;
player2Shooting = FALSE;
player2Shield = TRUE;
player2Reloading = FALSE;
player2Idle = FALSE;
break;
case 2:
//Shoot
if (player2Ammo > 0) {
[orbOutline2 removeFromParent];
delayLargeOutline2 = TRUE;
xPos = 900;
yPos = 100;
CGPoint location = CGPointMake(xPos, yPos);
orbOutline2 = [SKSpriteNode spriteNodeWithImageNamed:@"shoot.rhythm orb outline"];
orbOutline2.position = location;
orbOutline2.scale = 0.1;
[self addChild:orbOutline2];
[player2Sprite removeFromParent];
delayShootingPlayer2 = TRUE;
[self addChild:[self player2SpriteNode:@"player2Shoot"]];
[self addChild:[self player2BulletNode]];
player2Shooting = TRUE;
player2Shield = FALSE;
player2Reloading = FALSE;
player2Idle = FALSE;
}
else {
[player2Feedback removeFromParent];
[self addChild:[self player2FeedbackNode:@"No Ammo!"]];
delayPlayer2Feedback = TRUE;
player2Health--;
}
break;
case 3:
//Reload
player2Ammo++;
[orbOutline2 removeFromParent];
delayLargeOutline2 = TRUE;
xPos = 900;
yPos = 100;
location = CGPointMake(xPos, yPos);
orbOutline2 = [SKSpriteNode spriteNodeWithImageNamed:@"shoot.rhythm orb outline"];
orbOutline2.position = location;
orbOutline2.scale = 0.1;
[self addChild:orbOutline2];
[player2Feedback removeFromParent];
[self addChild:[self player2FeedbackNode:@"Reloading!"]];
delayPlayer2Feedback = TRUE;
player2Shooting = FALSE;
player2Shield = FALSE;
player2Reloading = TRUE;
player2Idle = FALSE;
break;
default:
NSLog(@"Error with AI");
break;
}
[eachOrb removeFromParent];
}
}
});
[self singlePlayer];
}
查看堆栈溢出的其他同类错误,似乎通常它本身的错误实际上并不是程序停止的地方,所以如果要找到解决方案你需要查看完整的代码,它可以在这里找到:(不想全部放在这里,可能有点太长了滚动浏览)https://gist.github.com/anonymous/23672cffde9964ece16e#file-gistfile1-m-L1259
(错误出现在 github 链接中的 1259 行中,而在上面的代码中,它出现在第四行中,上面写着 //ERROR appears here。
谢谢,如果您需要更多信息,请询问,我们将不胜感激。
【问题讨论】:
-
您可能希望将您的代码放在一个要点中。 gist.github.com。蜜蜂 txt 网站通过转义一些字符来搞砸代码
-
它在哪一行发出 EXC_BAD_ACCESS 信号?
-
不要在 Sprite Kit 中使用 dispatch_async 作为定时的东西,使用场景的 update: 方法来调度任务。否则你很难阻止这段代码在改变场景之后块执行之前运行,并且块也会在游戏暂停时执行。此外,保留您正在使用的范围内的任何对象的块可能会阻止某些对象被及时释放。
标签: objective-c macos runtime-error sprite-kit