2012-01-23 68 views
0

我想在我的Xcode項目中播放遠程MP3文件,但是下面的實現使用MPMoviePlayerController並不適合我,並且正在拋出異常。在iOS中通過HTTP播放遠程MP3文件5

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的最佳實踐通常避免直接接觸ivars(有一些例外,但使用ARC的情況更少,而且我在這裏沒有看到任何值得直接分配的例子)。

+0

很棒的回答。謝謝。 – Nick