2012-01-23 11 views
0

私はXcodeプロジェクトでリモートMP3ファイルを再生しようとしていますが、MPMoviePlayerControllerを使用して以下の実装が動作していないため例外がスローされます。iOS 5のHTTP経由でリモートMP3ファイルを再生

AVPlayerItemは割り当て解除されましたが、キー値オブザーバはまだ で登録されていました。

マイ.hファイル

#import <MediaPlayer/MediaPlayer.h> 

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer; 

マイ.mファイル

@synthesize moviePlayer = _moviePlayer; 

- (void)playEnglish 
{ 
NSURL *url = [NSURL URLWithString:_audioUrlEnglish]; 
_moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(moviePlayBackDidFinish:) 
name:MPMoviePlayerPlaybackDidFinishNotification 
object:_moviePlayer]; 

_moviePlayer.controlStyle = MPMovieControlStyleDefault; 
_moviePlayer.shouldAutoplay = YES; 
[self.view addSubview:_moviePlayer.view]; 
[_moviePlayer setFullscreen:YES animated:YES]; 
} 


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

if ([player 
respondsToSelector:@selector(setFullscreen:animated:)]) 
{ 
[player.view removeFromSuperview]; 
} 
} 

答えて

1

あなたはあなたのプレーヤーのために合成されたプロパティを指定したが、あなたは、直接代入しています象牙に

の代わりに:

__moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

あなたがする必要があります(あなたが自動参照カウントを使用している場合)

MPMoviePlayer *aPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
[self setMoviePlayer:aPlayer]; 

これはあなたのオブジェクトが適切に維持されることを保証します。これがなければ、あなたのプレーヤーは保持されていないと思われ、それはあなたのエラーを説明するでしょう。

さらに、コード内の他のいくつかの場所でインスタンス変数を割り当てたり、アクセスしたりしています。 Cocoaのベストプラクティスは、一般的にイーバールに直接触れることを避けています(ただし、いくつかの例外がありますが、ARCを使用する場合はさらに少なくなりますが、ここで直接割り当てを行うメリットはありません)。

+0

偉大な答え。ありがとうございました。 – Nick

関連する問題