无法释放MPMoviePlayerController

时间:2011-08-02 20:21:32

标签: iphone objective-c mpmovieplayercontroller

我创建了一个全局变量:

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参数,否则我将使用适当的参数调用该方法。

让我告诉你我得到的错误:

enter image description here enter image description here

1 个答案:

答案 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 时,接收方不使用通知发件人作为条件   删除。

可以在NSNotificationCenter Class Reference

中找到更多信息