0

ビューの1つにMPMoviePlayerがあるtabbarcontrollerを使用しています。タブを変更してもムービーが停止せず、バックグラウンドで再生し続けることを除けば、問題なく動作します。その後、ムービー タブにタブで戻そうとすると、クラッシュします。

MPMoviePlayer を解放する必要がある唯一のコードは、再生が終了したときだと思いますが、代わりにビューを変更したときに解放したいと考えています。その後、[ムービー] タブに戻ると、最初からやり直すことができます。

私の .h ファイルでは、次のように設定されています。


import < UIKit/UIKit.h>

import < MediaPlayer/MediaPlayer.h>


@interface SecondViewController : UIViewController {
    MPMoviePlayerController *player;
}

@end  

そして私の.mファイルには次のものがあります:


- (void)viewDidLoad {

 NSString *url = [[NSBundle mainBundle]
 pathForResource:@"vid"
 ofType:@"m4v"];

 player = [[MPMoviePlayerController alloc]
 initWithContentURL:[NSURL fileURLWithPath:url]];

 [[NSNotificationCenter defaultCenter]

 addObserver:self
 selector:@selector(movieFinishedCallback:)
 name:MPMoviePlayerPlaybackDidFinishNotification
 object:player];

 //--called when the movie view and then add it to the View window--
 player.view.frame = CGRectMake(10, 10, 300, 300);
 [self.view addSubview:player.view];

    //--play movie--
    [player pause];

    [super viewDidLoad];
}

//--called when the movie is done playing--
- (void) movieFinishedCallback:(NSNotification*) aNotification {
    MPMoviePlayerController *moviePlayer = [aNotification object];
    [[NSNotificationCenter defaultCenter]
     removeObserver:self
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:moviePlayer];
    [moviePlayer.view removeFromSuperview];
    [player release];
}

助言がありますか?ありがとうございました :)

4

1 に答える 1

0

タブ スイッチで MPMoviePlayer を本当に解放したい場合は、viewWillDisappearまたはviewDidDisappearで行います。あなたが説明したように、今ではバックグラウンドで生き残っています。タブに戻ったら、もう一度作成しようとします。

クラッシュの正確な理由を言うのは難しいですが、いくつかの可能性があるようです。次回は、コール スタックを使用して「なぜこれがクラッシュしたのか」という質問を書きます。

ユーザーがタブを変更するたびに新しい moviePlayer を再割り当てする必要がないように、一時停止/再開だけを考えることができますか? viewDidLoad と viewDidUnload では割り当て/解放を行いますが、viewWillAppear と viewWillDisappear では再生/一時停止を行います。

于 2011-04-06T12:28:34.107 に答える