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

我使用了 Apple docs的AVPlayerDemo样本,并在自己的界面上写了自己的UI,播放从UITableViewController中选择的视频.现在,问题是这里有一个内存泄漏,我无法找到.问题是,AVPlayer对象没有被处理,我猜这是因为每次按下按钮并选择一个新的视频播放,这个应用程序消耗的总内存有一个巨大的跳跃,显示在这里

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

在这里,它已经跳到了58.2MB,并且每次回去再播放视频或者播放不同的视频时,它都会不断增加.

我试过使用仪器与泄漏,但还没有能够弄清楚它有什么问题.

整个控制器文件code.

//编辑

-(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方法时,它不会同步使定时器无效,而是等待下一个tick(不确定但是等待一段时间),然后才能使其释放.

现在,同时,idleTimer引用被设置为nil.在定时器的下一个勾号上,引用丢失,内存永远不会被释放,引用传播一直到ViewController,它的对象都不会被释放.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...