0

我有一个应用程序我有一段时间没碰过,并决定更新它。当我在 Xcode 4.6 中运行它时,我得到一个 Bad Access 错误,当我分析它时,我的 ViewController Alertview 是被调用并最终作为 NSZombie 留下的对象。

我不确定问题是警报视图还是它调用的视图控制器。

这是与调用警报视图的按钮相关联的操作:

- (IBAction)newGame:(id)sender {
timerIsActive = NO;
//UIImage *pauseImage = [UIImage imageNamed:rndImage];
UIImageView *pauseView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)] autorelease];
pauseView.image = gameImage;
[self.view addSubview:pauseView];

NSString *message = [NSString stringWithFormat:@"Would you like to reset the game?"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Game"
                                                message:message 
                                               delegate:self 
                                      cancelButtonTitle:@"Back to Game" 
                                      otherButtonTitles:@"New Game", nil];
[alert show];
[alert release];
[Flurry logEvent:@"New Game"];

}

警报视图如下:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
timerIsActive = NO;
NSString *buttonString = [actionSheet buttonTitleAtIndex:buttonIndex];
if( [buttonString isEqualToString:@"Main Menu"] ){

    [self.view removeFromSuperview];
} else if( [buttonString isEqualToString:@"View Board"] ){

} else if( [buttonString isEqualToString:@"Back to Game"] ){

    timerIsActive = YES;
    NSArray *arr =[self.view subviews];
    [[[self.view subviews] objectAtIndex:([arr count]-1)] removeFromSuperview];


} else if( [buttonString isEqualToString:@"New Game"] ){

    seconds = 120;
    board.numOfLetters = 0;
    board.currentWordLetters = nil;
    board.currentString = nil;
    board.words = nil;
    board.letters = nil;


    //[boardView release];
    //[board release];
    [timer invalidate];
    [self release];

    ViewController *viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    viewController.gameSize = self.gameSize;
    self.view = viewController.view;

}
4

1 回答 1

0

这看起来像问题区域:

ViewController *viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
viewController.gameSize = self.gameSize;
self.view = viewController.view;

您正在创建一个自动释放的视图控制器,将其视图分配给self.view,然后该方法结束。此时,没有任何东西拥有视图控制器,因此可以自由地释放它。

这不是从一个视图控制器转换到下一个视图控制器的正确方法。你不只是将视图从一个视图控制器传递到下一个视图控制器,你应该有一些东西来管理你的视图控制器。

在不了解您的应用程序架构的更多信息的情况下,很难提出纠正措施,但请考虑告诉负责您的游戏生命周期的任何对象(我猜在您的情况下是您的应用程序委托?)应该开始一个新游戏。该对象将保存当前的视图控制器,当它收到该消息时,它应该创建新的视图控制器 - 并拥有它。

您应该阅读 Apple 关于如何构建应用程序的文档,特别是关于视图控制器所扮演的角色和 Cocoa 的所有权规则的部分。

于 2013-03-14T01:20:19.723 回答