2011-12-27 2 views
0

Я создал приложение, которое компилируется нормально, но когда я пытаюсь снова играть, симулятор падает, и я не могу понять, почему. Соответствующие части в моем коде следующим образом: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]; 
    } 
} 

я вставил эти две части, как я думаю, что должно быть что-то неправильно, специально с GameScreenViewController, так как он выходит из строя, когда он входит в этот экран во второй раз (любой другой экран (например, от оповещения к HiScores). Не стесняйтесь просить какой-либо другой код, который вам может понадобиться, любая помощь будет оценена.

(Отредактировано): по запросу, вот что говорит консоль ...

(Отредактировано снова): предыдущий вставленный код не был настоящей частью, хотя я прочитал все ответы, единственный код I вернуться в консоль, когда он сработает, - «GDB: запрограммированный сигнал:« EXC_BAD_ACCESS », когда в Build & Отладка.

+4

Что говорится в отчете о сбое? Если приложение выходит из строя, тогда должна быть трассировка стека и т. Д. –

+0

@Mario, я не думаю, что это проблема с вашим кодом, но проверьте https://gist.github.com/1525182, где я отредактировал ваш код. Обязательно прочитайте прокомментированные строки, которые я добавил. –

+0

В дополнение к тому, что сказал @JackLawrence, прохождение вокруг указателей NSInteger вроде этого довольно странно и, вероятно, ошибка. Это, по-видимому, не является причиной текущей проблемы, которую вы видите, но это, скорее всего, вызовет проблемы позже. – Chuck

ответ

1

Где-то что-то пытается создать GameScreenViewController, но часть селектора initWithNibName:mode:level:bundle:10 опущена. Основываясь на обратном пути, он, по-видимому, находится в вашем методе iFocus2AppDelegate flipToGameScreen:aLevel:, хотя я его не вижу. Вы можете попробовать очистить свой проект, если используется старая версия класса.

0

Благодаря David Rönnqvist & Чак в основном, я начал уделять больше внимания консоли и тому сообщению «EXC_BAD_ACCESS».

Проблема была не плохим вызовом, а плохой очисткой NSMutableArray, что создавало утечку памяти, которая увеличивалась экспоненциально, поскольку у меня есть несколько больших циклов в некоторой части моего кода. Я думал, что инструкция «release» очистит все, что я создал, но, похоже, это не так (я должен сказать, у меня больше опыта программирования для Android и Windows Phone, я пытаюсь перевести мои решения в iPhone).

Таким образом, добавив [myArray RemoveAllObjects] в начале моего кода, я решил проблему.

Как сказал Ганди, вы снабдили меня удочкой, а не рыбой. Большое спасибо ранее упомянутому, а также Джеку Лоуренсу за его усилия.

 Смежные вопросы

  • Нет связанных вопросов^_^