0

しばらく触れていないアプリがあり、更新することにしました。Xcode 4.6で実行すると、Bad Accessエラーが発生し、プロファイルを作成すると、ViewController Alertviewが呼び出され、最終的にNSZombieとして残されるオブジェクトになります。

問題がalertviewなのか、それともそれが呼び出すビューコントローラなのかはわかりません。

アラートビューを呼び出すボタンに関連付けられたアクションは次のとおりです。

- (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、メソッドを終了します。この時点では、View Controllerを所有しているものはないため、自由に割り当てを解除できます。

これは、あるViewControllerから次のViewControllerに移行する正しい方法ではありません。ビューをあるビューコントローラから次のビューコントローラに渡すだけでなく、ビューコントローラを管理するものが必要です。

アプリケーションアーキテクチャについて詳しく知らなければ、修正措置を提案することは困難ですが、ゲームのライフサイクルを担当しているオブジェクト(あなたの場合はアプリのデリゲートだと思います)に新しいゲームを開始するように指示することを検討してください。そのオブジェクトは現在のViewControllerを保持し、そのメッセージを受信すると、新しいViewControllerを作成して所有する必要があります。

アプリケーションの構成方法に関するAppleのドキュメント、特にビューコントローラが果たす役割とCocoaの所有権ルールに関する部分を読む必要があります。

于 2013-03-14T01:20:19.723 に答える