objective-c - MPMoviePlayer 错误的激活状态?

标签 objective-c ios

我正在使用内置的 MPMoviePlayerController 播放视频。我在使用两个 MPMoviePlayerController 时遇到了问题(请注意,不会同时播放两个视频)。我可以在第一个 Controller 上播放任意数量的视频,完成后将其处理掉,然后分配另一个 MPMoviePlayerController。一旦我在第二个 Controller 上设置了 controlStyle,我就会收到带有

的 SIGABRT

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“电影播放器​​激活状态错误 (1)”

网上查了下,stack overflow上也有类似的问题。那家伙说他忘了删除播放完成的通知。我相信我已经使用 [[NSNotificationCenter defaultCenter] removeObserver: self];

我仍然遇到崩溃。相当令人沮丧!

我不明白为什么不能同时使用两个 Controller ,只要它们不同时播放。我宁愿不必为了让视频正常工作而深入研究 AVPlayer 的东西。

谢谢!

编辑:注释掉 controlStyle 赋值仍然会导致崩溃。下面是发布的调用堆栈,以及该类中的一些重要方法。

- (void) makePlayer;
{
[player.view removeFromSuperview];
[player release];
player = [MPMoviePlayerController new];
player.view.frame = self.bounds;
player.view.hidden = YES;
player.controlStyle = MPMovieControlStyleNone;
player.scalingMode = MPMovieScalingModeNone;
[self addSubview: player.view];
}

- (void) dealloc;
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[player.view removeFromSuperview];
[player release];
[super dealloc];
}

- (void) setMovieByName: (NSString *) name;
{
[self makePlayer];
player.shouldAutoplay = NO;
[player setContentURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: name ofType: @"mov"]]];
[player stop];
[player prepareToPlay];
[[NSNotificationCenter defaultCenter] removeObserver: self];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(movieDimensionsKnown:) name:MPMovieNaturalSizeAvailableNotification object: player];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object: player];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object: player];
}

- (void) playbackFinished: (NSNotification *) n
{   
player.view.hidden = YES;
if ([delegate respondsToSelector: @selector(moviePlayerImageViewPlaybackDidFinish:)])
    [delegate moviePlayerImageViewPlaybackDidFinish: self];
}

最佳答案

我想我明白了你的问题。您甚至在分配它之前就释放了 player。基本上,编译器第一次检查您的代码时,它会看到 player 的保留计数为 -1(因为 release 调用),然后再次上升到 0你分配它(因为 new 调用)。因此,当您第一次尝试设置任何属性时,没有对象可以将属性设置为(player 的保留计数永远不会为 1)。 你应该做的是检查 player 是否存在,只有当它已经存在时,你才释放它。

尝试对您的 ma​​kePlayer 方法进行此更改:

- (void) makePlayer {

if (player != nil) {

[player.view removeFromSuperview];
player = nil;
[player release];

}

player = [MPMoviePlayerController new];
player.view.frame = self.bounds;
player.view.hidden = YES;
player.controlStyle = MPMovieControlStyleNone;
player.scalingMode = MPMovieScalingModeNone;
[self addSubview: player.view];
}

编辑:做了细微的改动。 player 是一个实例变量,所以您实际上要做的是检查它是否已经被设置为一个对象。

关于objective-c - MPMoviePlayer 错误的激活状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783596/

相关文章:

objective-c - SQLite 3 WAL模式多进程频繁破坏数据库

objective-c - 覆盖 Apple Siri 远程菜单按钮默认行为

objective-c - 有没有办法在 AFNetworking 1.3 中注册自定义接受 header 以解析为 JSON?

ios - 在默认 UIsearchBar 中更改 UITextField 的高度

ios - 自定义初始化程序而不覆盖 init?

ios - 在 block 中创建对象

ios - 如何创建具有新原点但利用现有尺寸的 CGRect?

iphone - 我可以在没有设备的情况下从 iTunes 测试应用程序吗?

ios - UITableView 单元格不使用标签文本自动调整大小

ios - 使用 RubyMotion 解析 JSON