我正在使用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
,因此我不能只将其硬编码为仅在我连续收到两个通知时才会发布。
答案 0 :(得分:0)
在你的回调方法中,尝试在释放之前将自己移除为观察者。
[[NSNotificationCenter defaultCenter] removeObserver: self name: MPMoviePlayerPlaybackDidFinishNotification object: myMPMoviePlayerController];