iOS中的内存泄漏,AVPlayer永远不会被释放

时间:2014-07-18 08:40:29

标签: ios memory-leaks profiling instruments avplayer

我使用了来自Apple docs的AVPlayerDemo示例,并在其上面编写了我自己的UI来播放从UITableViewController中选择的视频。现在,问题是这里有一个我无法找到的内存泄漏。问题是AVPlayer对象没有被释放,我猜这是因为每次按回按钮并选择要播放的新视频时,应用程序消耗的总内存会大幅跳跃,如下所示:

The first time the video is player, the memory usage is 36.6MB

视频第一次播放时,内存使用量为36.6MB,现在是第二次:

Here it has jumped to 58.2MB

这里它已经跃升至58.2MB,并且每次我回去再次播放视频或不同的视频时都会继续增加。

enter image description here

我曾尝试使用带泄漏的仪器,但尚未弄清楚它有什么问题。

继承整个Controller文件code

// EDIT

-(void) viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];

    if(_player.rate == 1.0){
        [_player pause];
    }

    [idleTimer invalidate];

    if(mTimeObserver){
        [_player removeTimeObserver:mTimeObserver];
        mTimeObserver = nil;
    }
    [_playerItem removeObserver:self forKeyPath:kStatusKeyT];
    [[NSNotificationCenter defaultCenter] removeObserver:self                                                 name:AVPlayerItemDidPlayToEndTimeNotification object:_playerItem];


    _player = nil;
    _playerItem = nil;
    idleTimer = nil;
    _tapGestureRecognizer = nil;
}

-(void) dealloc
{
    NSLog(@"DEALLOCING");
}

2 个答案:

答案 0 :(得分:2)

问题出在idleTimer上。当在idleTimer上调用invalidate方法时,它不会同步使计时器失效,而是等待下一个tick(不确定,但确实等待一段时间),然后才能使它失效。

现在,同时,idleTimer引用被设置为nil。在计时器的下一个滴答声中,引用将丢失并且内存永远不会释放,并且引用一直传播到ViewController,并且不会释放任何对象。

答案 1 :(得分:0)

我遇到了与您相同的问题,但是我设法通过在viewDidDisappear上进行调用来解决了内存泄漏问题:

self.avPlayer?.replaceCurrentItem(with: nil)