【问题标题】:How do you release an MPMoviePlayerViewController after playback finishes?播放完成后如何释放 MPMoviePlayerViewController?
【发布时间】: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,再次说MPMovieFinishReasonPlaybackErrorMPMoviePlayerViewController 在第二个通知仍在发送时被解除分配。我的问题是:我如何摆脱这个警告?请记住,在正常播放结束时,仅发出MPMovieFinishReasonPlaybackEnded,因此我不能将其硬编码为仅在连续收到两个通知时才发布。

【问题讨论】:

    标签: ios cocoa-touch memory-management


    【解决方案1】:

    在您的回调方法中,在发布通知之前尝试将自己移除为通知的观察者。

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

    【讨论】:

    • 试过了,我仍然得到同样的警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多