【发布时间】:2012-04-06 16:30:33
【问题描述】:
我正在使用 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 在 key 时被释放 价值观察者仍然在其中注册。观察信息是 泄漏,甚至可能被错误地附着在其他物体上。 在 NSKVODeallocateBreak 上设置断点以在调试器中停止。
原因是因为moviePlayBackDidFinish在视频崩溃时被调用了两次。一次说MPMovieFinishReasonPlaybackEnded,再次说MPMovieFinishReasonPlaybackError。 MPMoviePlayerViewController 在第二个通知仍在发送时被解除分配。我的问题是:我如何摆脱这个警告?请记住,在正常播放结束时,仅发出MPMovieFinishReasonPlaybackEnded,因此我不能将其硬编码为仅在连续收到两个通知时才发布。
【问题讨论】:
标签: ios cocoa-touch memory-management