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

Far*_*san 11 profiling memory-leaks instruments ios avplayer

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

视频第一次播放时,内存使用量为36.6MB

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

它已跃升至58.2MB

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

在此输入图像描述

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

下面是整个Controller文件代码.

//编辑

-(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");
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*sen 14

我和你有同样的问题,但我设法通过调用它来修复内存泄漏viewDidDisappear

self.avPlayer?.replaceCurrentItem(with: nil)
Run Code Online (Sandbox Code Playgroud)


Far*_*san 2

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

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