Cocos2d EXC_BAD_ACCESS

我是cocos2d的新手,突然得到了这个EXC_BAD_ACCESS,我做了一个新的获胜菜单,我得到错误我认为错误是因为我调用了一个已发布的对象,但我不发布任何内容? 我的调试控制台没有错误,这很奇怪

这是我的Level_1.m

// // Level_1.m // iPadGame // // Created by My Name on 1/25/12. // Copyright 2012 __MyCompanyName__. All rights reserved. // #import "Level_1.h" #import "HelloWorldLayer.h" CCSprite *player; CCSprite *enemy; CCSprite *enemy2; CCSprite *enemy3; CCSprite *star; CCSprite *star2; CCSprite *star3; CCSprite *bg; CCSprite *toolBar; CCLabelTTF *youWin; bool movePlayer; @implementation Level_1 @synthesize score; +(CCScene *) scene { // 'scene' is an autorelease object. CCScene *scene = [CCScene node]; // 'layer' is an autorelease object. Level_1 *layer = [Level_1 node]; // add layer as a child to scene [scene addChild: layer]; // return the scene return scene; } -(void) setUpWinMenu { [CCMenuItemFont setFontName:@"Marker Felt"]; [CCMenuItemFont setFontSize:75]; CCMenuItem *MainMenu = [CCMenuItemFont itemFromString:@"Main Menu" target:self selector:@selector(gotoMainMenu)]; CCMenu *WinMenu = [CCMenu menuWithItems:MainMenu, nil]; [self addChild:WinMenu]; MainMenu.position = ccp(400,500); } // on "init" you need to initialize your instance -(id) init { // always call "super" init // Apple recommends to re-assign "self" with the "super" return value if( (self=[super init])) { self.isTouchEnabled = YES; scoreNumber = 10; bg = [CCSprite spriteWithFile:@"metal_background.jpeg"]; bg.position = ccp(512,384); [self addChild:bg]; toolBar = [CCSprite spriteWithFile:@"ToolBar.png"]; toolBar.position = ccp(512,-30); [self addChild:toolBar]; score = [CCLabelAtlas labelWithString:@"0123456789" charMapFile:@"ScoreFinal.png" itemWidth:50 itemHeight:75 startCharMap:'.']; [self addChild:score]; score.position = ccp (-100,15); CCLabelTTF *scoreLabel = [CCLabelTTF labelWithString:@"Score:" fontName:@"Marker Felt" fontSize:45]; scoreLabel.position = ccp(score.position.x + 275,score.position.y + 40); scoreLabel.color = ccc3(0, 0, 0); [self addChild:scoreLabel]; star = [CCSprite spriteWithFile:@"Star.png"]; star.position = ccp(400,600); [self addChild:star]; star2 = [CCSprite spriteWithFile:@"Star.png"]; star2.position = ccp(600,600); star3 = [CCSprite spriteWithFile:@"Star.png"]; star3.position = ccp(200,600); player = [CCSprite spriteWithFile:@"ball.png"]; player.position = ccp(500,300); [self addChild:player]; enemy = [CCSprite spriteWithFile:@"SpaceShip.png"]; enemy.position = ccp(150,600); [self addChild:enemy]; enemy2 = [CCSprite spriteWithFile:@"SpaceShip.png"]; enemy2.position = ccp(250,600); [self addChild:enemy2]; enemy3 = [CCSprite spriteWithFile:@"SpaceShip.png"]; enemy3.position = ccp(350,600); [self addChild:enemy3]; [self schedule:@selector(enemyMove) interval:0.01]; [self schedule:@selector(collisionDetection) interval:0.01]; [self schedule:@selector(getStar) interval:0.01]; NSString *string = [NSString stringWithFormat:@"Score: %i", (int)scoreNumber]; [score setString:string]; x = 15; x2 = 15; x3 = 15; y = 15; Bx = 10; By = 10; movePlayer = FALSE; CCRepeatForever *repeat = [CCRepeatForever actionWithAction: [CCRotateBy actionWithDuration:2 angle:360]]; [star runAction:repeat]; star.visible = 1; } return self; } -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch* myTouch = [touches anyObject]; CGPoint location = [myTouch locationInView: [myTouch view]]; location = [[CCDirector sharedDirector]convertToGL:location]; CGRect playerRect = CGRectMake(player.position.x - (player.contentSize.width/2), player.position.y - (player.contentSize.height/2), player.contentSize.width, player.contentSize.height); CGRect Tlocation = CGRectMake(location.x, location.y, 10, 10); NSLog(@"Touch Began"); if (CGRectIntersectsRect (Tlocation, playerRect)) { player.position = location; movePlayer = TRUE; } } -(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *myTouch = [touches anyObject]; CGPoint point = [myTouch locationInView:[myTouch view]]; point = [[CCDirector sharedDirector] convertToGL:point]; if (movePlayer == TRUE) { player.position = point; if (player.position.y  1024 || enemy.position.x  1024 || enemy2.position.x  1024 || enemy3.position.x  768 || enemy.position.y < 120) { y = -y; } } -(void) collisionDetection { if (CGRectIntersectsRect(player.boundingBox, enemy.boundingBox)) { [self schedule:@selector(collisionAlert)]; } if (CGRectIntersectsRect(player.boundingBox, enemy2.boundingBox)) { [self schedule:@selector(collisionAlert)]; } if (CGRectIntersectsRect(player.boundingBox, enemy3.boundingBox)) { [self schedule:@selector(collisionAlert)]; } } -(void) getStar { if (CGRectIntersectsRect(player.boundingBox, star.boundingBox)) { NSLog(@"Got Star!"); scoreNumber += 100; NSString *string = [NSString stringWithFormat:@"Score: %i", (int)scoreNumber]; [score setString:string]; [self addChild:star2]; if (star.visible == 1) { } } if (CGRectIntersectsRect(player.boundingBox, star2.boundingBox)) { NSLog(@"Got Star!"); scoreNumber += 100; NSString *string = [NSString stringWithFormat:@"Score: %i", (int)scoreNumber]; [score setString:string]; [self addChild:star3]; } if (CGRectIntersectsRect(player.boundingBox, star3.boundingBox)) { youWin = [CCLabelTTF labelWithString:@"You Win" fontName:@"Marker Felt" fontSize:75]; youWin.position = ccp(500,400); [self addChild:youWin]; [self setUpWinMenu]; NSLog(@"Got Star!"); scoreNumber += 100; NSString *string = [NSString stringWithFormat:@"Score: %i", (int)scoreNumber]; [score setString:string]; player.position = ccp(player.position.x - 10, player.position.y - 20); [self unschedule:@selector(enemyMove)]; [self unschedule:@selector(collisionAlert)]; [self unschedule:@selector(getStar)]; } return; } -(void) collisionAlert { player.position = ccp(player.position.x - 10, player.position.y - 20); [self unschedule:@selector(enemyMove)]; UIAlertView* dialog = [[UIAlertView alloc] init]; [dialog setDelegate:self]; [dialog setTitle:@"Fail"]; [dialog setMessage:@"You are a Failure!"]; [dialog addButtonWithTitle:@"Goto Main Menu"]; [dialog addButtonWithTitle:@"Retry!"]; [dialog addButtonWithTitle:@"Dont push this button"]; [dialog show]; [dialog release]; [self unschedule:@selector(collisionAlert)]; } -(void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex { if(buttonIndex == 0) { [[CCDirector sharedDirector] replaceScene:[CCTransitionFlipAngular transitionWithDuration:1 scene:[HelloWorldLayer node]]]; } if (buttonIndex == 1) { [[CCDirector sharedDirector] replaceScene:[Level_1 node]]; } if (buttonIndex == 2) { [self schedule:@selector(noting)]; } } -(void) gotoMainMenu { [[CCDirector sharedDirector] replaceScene:[CCTransitionJumpZoom transitionWithDuration:1 scene:[HelloWorldLayer node]]]; } @end 

我没有完全完成,但可能有一些空方法,但我确定这不是什么导致问题

所有这些对象:

 CCSprite *player; CCSprite *enemy; CCSprite *enemy2; CCSprite *enemy3; CCSprite *star; CCSprite *star2; CCSprite *star3; CCSprite *bg; CCSprite *toolBar; 

正在使用自动释放方法分配,例如CCSprite spriteWithFile:然后,当您在其他方法中访问这些对象时,就像在ccTouchesBegan: withEvent:它们已经被释放,并且您获得了EXC_BAD_ACCESS

你可以做的一件事就是调用spriteWithFile:方法,然后调用retain调用

 toolBar = [[CCSprite spriteWithFile:@"ToolBar.png"] retain]; 

但是不要忘记在Level_1的类dealloc上释放保留的对象(我没有看到你的类中实现的)

 -(void) dealloc { [toolBar release]; [super dealloc] } 

即使您在控制台上没有看到任何内容,如果您在调试器下运行应用程序,您应该能够在崩溃时检查调用堆栈。

如果您正在访问某些已经解除分配的对象,或者可能尝试发送消息,这将清楚地告诉您。