我创建了一个全局变量:
MPMoviePlayerController *player;
我使用以下方法播放视频:
- (IBAction)playMovie:(NSString *)videoName ViedeoType:(NSString *)videoType {
ViewVideoSubview.alpha = 0;
NSString *url = [[NSBundle mainBundle]
pathForResource:videoName
ofType:videoType];
player =
[[MPMoviePlayerController alloc]
initWithContentURL:[NSURL fileURLWithPath:url]];
player.shouldAutoplay =YES;
[ViewVideoSubview addSubview:player.view];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(movieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:player];
}
当视频单独完成播放时,会调用以下方法:
- (void) movieFinishedCallback:(NSNotification*) aNotification {
[player.view removeFromSuperview]; //d1
MPMoviePlayerController *playerParam = [aNotification object];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:playerParam];
[player release];
}
到目前为止,一切都很顺利。问题是我有一个按钮,按下时我需要加载另一个视图控制器。我能够加载该视图控制器,但视频仍然在后台播放。我不知道发布播放器时出错的原因。我的临时解决方案是停止视频然后加载其他视图控制器,以便视频不在后台播放。
我想到的另一个解决方案是在完成播放之前1秒播放视频,以便使用方法movieFinishedCallback释放它。我不知道如何将视频“快进”到那一点。我是objective-c的新手,我不知道什么是aNotification参数,否则我将使用适当的参数调用该方法。
让我告诉你我得到的错误:
答案 0 :(得分:2)
我认为您的问题在于您尝试在方法movieFinishedCallback
中删除观察者的方式
这里你传递一个指向全局属性播放器的指针。
MPMoviePlayerController *playerParam = [aNotification object];
在这里,您正在调用一个方法来删除有关此对象的所有通知的观察者playerParam
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:playerParam];
现在你得到一个EXEC_BAD_ACCESS,因为你正在向你的playerParam
(已经在某处释放)发送一个指针(player
)到一个方法(removeObserver
),导致{{1}的操作在不存在的对象上调用。
而不是使用
removeObserver
试
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:playerParam];
让你的对象为零:
中找到更多信息- (void)removeObserver:(id)notificationObserver name:(NSString *)notificationName对象:(id)notificationSender
notificationSender ...... 当nil 时,接收方不使用通知发件人作为条件 删除。