2011-12-27 1 views
0

다시 컴파일하려고하는 앱을 만들었지 만 다시 재생하려고하면 시뮬레이터가 충돌하고 이유를 파악할 수 없습니다. 다음과 같이 내 코드의 관련 부분은 다음과 같습니다 : 나는 그것이 두 번째 시간이 화면 (다른 화면을 입력 할 때 충돌로 잘못 특별히 GameScreenViewController 뭔가가 있어야합니다 생각하는 Objective-C : 앱이 한 번만 실행되지만 완벽하게 컴파일됩니다.

iFocus2AppDelegate.m 


- (void) flipToGameScreen:(NSInteger *)aMode aLevel:(NSInteger*)aLevel 
{ 
    NSInteger *myMode = aMode; 
    NSInteger *myLevel = aLevel; 

    GameScreenViewController *aGameScreenView = [[GameScreenViewController alloc] initWithNibName:@"GameScreen" mode:myMode level:myLevel bundle:nil]; 
    [self setGameScreenViewController:aGameScreenView]; 
    [aGameScreenView release]; 
    gameScreenViewController.view.frame =[[UIScreen mainScreen] applicationFrame]; 

    //animation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache: YES]; 
    [viewController.view removeFromSuperview]; 
    [self.window addSubview:[gameScreenViewController view]]; 
    [UIView commitAnimations];  

} 


GameScreenViewController.m 


- (id)initWithNibName:(NSString *)nibNameOrNil mode:(NSInteger *)myMode level:(NSInteger *)myLevel bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) 
    { 
     // Custom initialization. 
     self.selectedMode = myMode; 
     self.selectedLevel = myLevel; 

    } 
    return self; 
} 

- (void) finished 
{ 
    [myTimer invalidate]; 
    myTimer = nil; 
    [myTimer release]; 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"GameOver" 
       message:@"Do Something" 
       delegate:self 
       cancelButtonTitle:nil 
       otherButtonTitles:nil]; 
    [alert addButtonWithTitle:@"Play Again"]; 
    [alert addButtonWithTitle:@"Show HiScores"]; 
    [alert addButtonWithTitle: @"Setup New Game"]; 

    [alert show]; 
    [alert release]; 
} 

- (void) alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0) 
    { 
     //PlayAgain 
     iFocus2AppDelegate *mainDelegate = (iFocus2AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [mainDelegate flipToGameScreen:selectedMode aLevel:selectedLevel]; 
     [iFocus2AppDelegate release]; 

    } 
    if (buttonIndex == 1) 
    { 
     //scores 
     iFocus2AppDelegate *mainDelegate = (iFocus2AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [mainDelegate flipToHiScores]; 
     [iFocus2AppDelegate release]; 
    } 
    if (buttonIndex == 2) 
    { 
     //setings 
     iFocus2AppDelegate *mainDelegate = (iFocus2AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [mainDelegate flipToGameSettings]; 
     [iFocus2AppDelegate release]; 
    } 
} 

나는이 두 조각을 붙여 (즉, 경고에서 HiScores로) 작업 할 수 있습니다. 다른 코드를 요청할 수 있으면 언제든지 도움을받을 수 있습니다.

(수정 됨) : 요청에 따라 콘솔이 말하는 내용은 다음과 같습니다.

(다시 편집 됨) : 이전에 붙여 넣은 코드는 실제 부분이 아니며, 모든 대답을 읽었음에도 불구하고 유일한 코드 "GDB : 프로그램 수신 신호 : EXC_BAD_ACCESS"가 빌드 & 디버그 일 때 충돌합니다.

+4

오류 보고서의 내용은 무엇입니까? 응용 프로그램이 충돌하면 스택 추적 등이 있어야합니다. –

+0

@Mario,이 코드에 문제가 있다고 생각하지 않지만 https://gist.github.com/1525182에서 수정 한 내용을 확인하십시오. 암호. 내가 추가 한 주석이 달린 행을 읽으십시오. –

+0

@ JackLawrence가 말한 것에 더하여, NSInteger 포인터를 지나치는 것은 아주 이상하고 아마 실수 일 것입니다. 현재보고있는 문제의 원인으로 보이지는 않지만 나중에 문제가 발생할 가능성이 큽니다. – Chuck

답변

1

어떤 곳에서 GameScreenViewController를 만들려고 시도하지만 선택자 initWithNibName:mode:level:bundle: 부분의 bundle: 부분이 생략되었습니다. 백 트레이스를 기반으로 iFocus2AppDelegate의 flipToGameScreen:aLevel: 메서드에있는 것처럼 보일 수 있지만 거기에는 표시되지 않습니다. 이전 버전의 클래스가 사용중인 경우 프로젝트를 정리할 수도 있습니다.

0

David Rönnqvist 덕분에 & Chuck이 주로 콘솔과 그 "EXC_BAD_ACCESS"메시지에 더주의를 기울이기 시작했습니다.

문제는 나쁜 호출이 아니지만 NSMutableArray의 잘못된 정리가 아니므로 코드의 일부에서 큰 루프가 몇 개 발생했기 때문에 기하 급수적으로 메모리 누수가 발생합니다. 필자는 "release"명령으로 작성한 모든 내용을 정리할 수 있다고 생각했으나 안드로이드와 Windows Phone에 대한 프로그래밍 경험이 더 많았습니다. 솔루션을 iPhone으로 변환하려고합니다.

따라서 코드 시작 부분에 [myArray RemoveAllObjects]를 추가하여 문제를 해결했습니다.

간디 (Ghandi)가 말했듯이, 당신은 물고기 대신 낚싯대를 제공했습니다. 잭 로렌스에게 많은 도움을 주신 데 대해 감사드립니다.

관련 문제