0

ハウディ!私はiPadアプリを書いています。UIViewが読み込まれたらビデオを再生する必要があります。しかし、私はそれを初期化した後に私のMPMoviePlayerControllerをどこにでもメッセージしようとすると、BAD_EXC_ACCESSを取得していました。私は* .hファイルからMPMediaPlayerControllerを削除し、実装ファイルで完全に宣言しました。これで私のコードの下にメッセージが表示されます。ビルドと分析でメモリリーク(またはその問題については問題ありません)に関する問題はありません。これについての投稿は見つかりません。ここに私のコードは次のとおりですが、その後、クラッシュ時にエラーメッセージがある: "映画" "0x1b77f0 MPMoviePlayerController" を与えるのUIViewがロードされた直後にビデオを再生

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

    } 

NSString *url = [[NSBundle mainBundle] pathForResource:@"p0600c0100cmpintro" ofType:@"m4v"]; 
MPMoviePlayerController *movie = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]]; 
NSLog(@"%@", movie); 
movie.view.frame = CGRectMake(5, 0, 1035, 768); 
movie.view.contentMode = UIViewContentModeScaleToFill; 
[[movie view] setCenter:CGPointMake(movie.view.center.x-10, movie.view.center.y)]; 
[movie setControlStyle:MPMovieControlStyleNone]; 
    [movie setShouldAutoplay:YES]; 
[[self view] addSubview:[movie view]]; 

    return self; 
    } 

のNSLog "* - [MPMoviePlayerController playbackState]:割り当て解除インスタンス0x1473a0に送信されたメッセージ"。助けて?

答えて

0

解決策は数​​週間前に見つかりましたが、この記事は忘れました。私はMPMoviePlayerControllerを正常にリリースしていませんでした。不思議なことに、MPMoviePlayerControllerをリリースするには、まずNSNotificationCenter(設定されている場合)から通知を削除し、ムービーを停止して(再生が終了していても)、次に解放しなければなりません。私は、最初のMPMoviePlayerControllerを使ってこのアプリケーションを以前に実行していなかったので、解放されたインスタンスを参照しようとしていました。ムービーの再生が完了すると、ムービーを正常にリリースするコードは次のようになります。

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:movie]; 
[movie.view removeFromSuperview]; 
[movie stop]; 
[movie release]; 
0

ドキュメンテーションによると、ムービービューのフレームは、その親ビューと一致する必要があります。またinitWithNibNameのうち、あなたのコードを移動してみてください:バンドル:のviewDidLoadへ:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIView *movieContainer = [[UIView alloc] initWithFrame:CGRectMake(5, 0, 300, 400)]; 
    //Do any other positioning of the view you would like 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"p0600c0100cmpintro" ofType:@"m4v"]; 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    MPMoviePlayerController *movie = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
    movie.view.frame = movieContainer.bounds; //Make sure this is the bounds of its parent view 
    movie.scalingMode = MPMovieScalingModeFill; 
    movie.controlStyle = MPMovieControlStyleNone; 
    movie.shouldAutoplay = YES; 

    [movieContainer addSubview:movie.view]; 
    [self.view addSubview:movieContainer]; 

    [movieContainer release]; 
} 

最後の一つの提案は、ビューコントローラが

+0

いいえ。私はまだ "メッセージを割り当て解除されたインスタンス

"に送信しました。しかし、今私は、クラッシュする代わりに、素敵な空白の白いページを取得します。これは、コードをviewDidLoadメソッドに移動したためです。 – Jacob

0

を割り当て解除されます一度あなたがそれをDEALLOCできるように、映画の参照を保持することですあなたのMoviePlayerをviewDidLoadに作成し、次にviewDidAppearで映画を再生して、最良の結果を得ることをお勧めします。

+0

MPMoviePlayerControllerを割り当てて初期化しようとすると、問題が発生しています。なぜ私は考えていない。私は私のアプリで別のビデオをプレイしています。私は現在、私が戦っているビデオでそのコンテンツを切り替えました。 – Jacob

+0

それでは、ビデオ自体に問題があるように見えますか? – WrightsCS

+0

ああ、私の意味は誤解されていた。私が問題を抱えているビデオは、最初の場所でうまくいきました。私はビデオの最初のフレームを表示するように管理しましたが、shouldAutoplayをYESに設定すると、「解除された」メッセージが再び表示され、アプリケーションがクラッシュします。 「映画」に「再生」メッセージを送信しようとすると、「割り振り解除」メッセージが表示されます。 – Jacob

0

さてさて、私は、以前の割り当てが解除されていた別のMPMoviePlayerControllerインスタンスを持っていますが、私はMPMoviePlayerControllerの別のインスタンスを作成しようとすると、このいずれかに送信されたすべてのメッセージは、メモリの問題が生じ、解放済みのインスタンスに送信されました。だから私は最初のインスタンスをリリースした部分を削除したところ、完全にうまく動作します。私の質問はこれです:この最初のインスタンスを割り当て解除して、必要でないときにメモリに負担をかけない方法がありますか?私はこの問題に対するより洗練された解決策があるべきだと感じています。私はこのアプリケーションで頻繁にビデオを再生する必要があります。

関連する問題