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