iOS中的内存泄漏,AVPlayer永远不会被释放
我使用了来自Apple文档的AVPlayerDemo示例,并在其上面编写了我自己的UI来播放从UITableViewController中选择的video。 现在,问题是这里有一个我无法找到的内存泄漏。 问题是AVPlayer对象没有被解除分配,我猜这是因为每次按下后退按钮并选择要播放的新video时,应用程序消耗的总内存会大幅跳跃,如下所示:
video第一次播放时,内存使用量为36.6MB,现在是第二次:
它已经跃升至58.2MB,并且每次我回去再播放video或不同的video时都会继续增加。
我曾尝试使用带泄漏的仪器,但尚未弄清楚它有什么问题。
下面是整个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"); }
问题出在idleTimer上。 当在idleTimer上调用invalidate方法时,它不会同步使计时器失效,而是等待下一个滴答(不确定,但确实等待一段时间),然后再使其失效。
现在,同时,idleTimer引用被设置为nil。 在计时器的下一个滴答声中,引用将丢失并且内存永远不会释放,并且引用一直传播到ViewController,并且不释放任何对象。
我和你有同样的问题,但我设法通过在viewDidDisappear
上viewDidDisappear
来修复内存泄漏:
self.avPlayer?.replaceCurrentItem(with: nil)