我正在尝试在我的Xcode项目中播放一个远程MP3文件,但是下面的实现,使用MPMoviePlayerController对我不起作用并且抛出异常。
当关键值观察者仍然存在时,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];
}
}
答案 0 :(得分:1)
您已为播放器指定了合成属性,但您可以直接指定给ivar。
而不是:
__moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
你应该:
MPMoviePlayer *aPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
[self setMoviePlayer:aPlayer];
这将确保您的对象被正确保留(如果您使用自动引用计数)。如果没有这个,看起来您的播放器没有被保留,这可以解释您的错误。
此外,您还在代码中的其他几个位置分配/访问实例变量。 Cocoa中的最佳实践通常可以避免直接触及ivars(有一些例外,但是使用ARC时更少,而且我没有看到任何值得直接分配的示例)。