1

mpmovieplayercontrollerゲームで映画を再生するために使用しています。ユーザーが画面をタップすると、ムービーを含む現在のレイヤーをゲームのメイン メニューに置き換えるメソッドが実行されます。最初は問題なく動作しますが、メイン メニューから 2 回目にビデオを再生しようとすると、回線で EXC_BAD_ACCESS エラーが発生します。

int retVal = UIApplicationMain(argc, argv, nil, @"AppController");

メインで.m。

以下の関連コードを見つけてください。

-(void)playVideo    {
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"movie" ofType:@"mp4"]];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
moviePlayer.repeatMode = MPMovieRepeatModeOne;

// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayBackDidFinish:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:moviePlayer];

if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) {
    // Use the new 3.2 style API
    moviePlayer.controlStyle = MPMovieControlStyleNone;
    moviePlayer.shouldAutoplay = YES;
    // This does blows up in cocos2d, so we'll resize manually
    [moviePlayer setFullscreen:YES animated:YES];

    CGSize winSize = [[CCDirector sharedDirector] winSize];       
    moviePlayer.view.frame = CGRectMake(0, 0, winSize.width, winSize.height);    //width and height are swapped after rotation        
    [[[CCDirector sharedDirector] view] addSubview:moviePlayer.view ];

    [moviePlayer play];

    UITapGestureRecognizer * tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tapGestureRecognizer.delegate = (id)self;
    tapGestureRecognizer.numberOfTapsRequired = 1;
    [[[CCDirector sharedDirector] view] addGestureRecognizer:tapGestureRecognizer];

    [tapGestureRecognizer release];

} else {
    // Use the old 2.0 style API
    moviePlayer.controlStyle = MPMovieControlStyleNone;
    [moviePlayer play];
}

}

- (void)handleTap:(UITapGestureRecognizer *)gesture {

[moviePlayer stop];
[[MenuManager sharedMenuManager] runMenu:kMMenuLayer];

}

// this enables you to handle multiple recognizers on single view
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}

-(void)moviePlayBackDidFinish:(NSNotification*)notification {
moviePlayer = [notification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:moviePlayer];

// If the moviePlayer.view was added to the openGL view, it needs to be removed
if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) {
    [moviePlayer.view removeFromSuperview];
    CCLOG(@"this block is okay");
}

[moviePlayer release];
}

助けてください。

4

1 に答える 1

0

メッセージが割り当て解除されたインスタンスに送信される理由は、ビューから tapGestureRecognizer を削除していないためです。MenuManager シングルトンは現在のレイヤーを別のレイヤーに置き換えると思いますが、tapGestureRecognizer はまだビューの一部であるため、この時点で割り当てが解除されている handleTap にアクセスしようとします。handleTap のシングルトン呼び出しの前に次の行を追加します。

 [[[CCDirector sharedDirector] view] removeGestureRecognizer:tapGestureRecognizer];
于 2013-12-03T03:38:19.213 に答える