Objective-C: приложение запускается только один раз, хотя отлично компилируется - PullRequest
0 голосов
/ 28 декабря 2011

Я создал приложение, которое нормально компилируется, но, когда я пытаюсь играть снова, симулятор вылетает, и я не могу понять, почему. Соответствующие части в моем коде следующие:

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) работает. попросите любой другой фрагмент кода, который вам может понадобиться, любая помощь будет оценена.

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

(отредактировано снова): предыдущий вставленный код не был реальной частью; несмотря на то, что я прочитал все ответы, единственный код, который я получаю в консоли при сбое, это "GDB: Программа получила сигнал:" EXC_BAD_ACCESS "в Build & Debug.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

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

0 голосов
/ 28 декабря 2011

В основном благодаря Дэвиду Рённквисту и Чаку я стал уделять больше внимания консоли и сообщению «EXC_BAD_ACCESS».

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

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

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

...