Objective-C:App只运行一次,但编译完美

时间:2011-12-27 21:03:32

标签: objective-c crash alert viewcontroller

我已经创建了一个编译好的应用程序但是,当我再次尝试播放时,模拟器崩溃了,我无法弄清楚原因。我的代码中的相关部分如下:

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“在构建和调试时。

2 个答案:

答案 0 :(得分:1)

在某个地方,某些东西正试图创建一个GameScreenViewController,但是省略了选择器bundle:的{​​{1}}部分。基于回溯,它似乎在你的iFocus2AppDelegate的initWithNibName:mode:level:bundle:方法中,虽然我没有在那里看到它。如果正在使用旧版本的类,您可以尝试清理项目。

答案 1 :(得分:0)

感谢DavidRönnqvist& Chuck主要是,我开始进一步关注控制台,以及“EXC_BAD_ACCESS”消息。

问题不是一个糟糕的调用,而是对NSMutableArray的清理不好,从而导致内存泄漏呈指数级增长,因为我的代码的某些部分有一些大的循环。我认为“发布”指令会清理我创建的任何内容,但似乎没有(我必须说,我有更多的Android和Windows Phone编程经验,我正在尝试将我的解决方案转换为iPhone)。

因此,通过在代码的开头添加[myArray RemoveAllObjects],我已经解决了问题。

甘地说,你给我提供了钓竿而不是鱼。非常感谢前面提到的,以及Jack Lawrence的努力。