播放完成后如何释放MPMoviePlayerViewController?

时间:2012-03-22 05:09:08

标签: ios cocoa-touch memory-management

我正在使用MPMoviePlayerViewController在iOS中播放视频。当视频停止或崩溃时,我想关闭此视图控制器并将其释放。为了模拟崩溃,我传入了一个不存在的文件路径:

MPMoviePlayerViewController* p = [
    [MPMoviePlayerViewController alloc] init
];
self.player = p;
[p release];
[[NSNotificationCenter defaultCenter] 
    addObserver:self
    selector:@selector(moviePlayBackDidFinish:)
    name:MPMoviePlayerPlaybackDidFinishNotification
    object:self.player.moviePlayer
];
self.player.moviePlayer.contentURL = @"purposelyFake.mp4";

这将立即触发以下回调。

- (void) moviePlayBackDidFinish
{
    if (self.player != nil) {
        [self.player.moviePlayer stop];
        self.player = nil
    }
}

self.player是非原子保留属性,因此将其设置为nil应该会释放它。这会清除内存,但我的日志会显示此警告:

  

类AVPlayerItem的实例0x127b20在键时被释放   价值观察员仍在注册。观察信息是   泄露,甚至可能被错误地附着在其他物体上。   在NSKVODeallocateBreak上设置一个断点,在调试器中停止。

原因是因为视频崩溃时会调用moviePlayBackDidFinish两次。一旦说MPMovieFinishReasonPlaybackEnded再说MPMovieFinishReasonPlaybackError。在第二个通知仍在发送时,MPMoviePlayerViewController将被取消分配。我的问题是:如何摆脱这种警告?请记住,在正常播放完成时,只会发出MPMovieFinishReasonPlaybackEnded,因此我不能只将其硬编码为仅在我连续收到两个通知时才会发布。

1 个答案:

答案 0 :(得分:0)

在你的回调方法中,尝试在释放之前将自己移除为观察者。

[[NSNotificationCenter defaultCenter] removeObserver: self name: MPMoviePlayerPlaybackDidFinishNotification object: myMPMoviePlayerController];