Подтвердить что ты не робот

Утечка памяти в iOS, AVPlayer никогда не освобождается

Я использовал образец AVPlayerDemo из Apple docs и написал свой собственный пользовательский интерфейс, чтобы воспроизводить видео, выбранные из UITableViewController. Теперь проблема в том, что там где-то утечка памяти, которую я не могу найти. Проблема в том, что объект AVPlayer не освобождается, я догадался об этом, потому что каждый раз, когда вы нажимаете кнопку "Назад" и выбираете новое видео для воспроизведения, происходит огромный скачок общей памяти, потребляемой приложением, которое показано здесь:

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

В первый раз, когда видео является проигрывателем, использование памяти составляет 36,6 МБ, теперь во второй раз:

Here it has jumped to 58.2MB

Здесь он подскочил до 58,2 МБ и продолжает увеличиваться каждый раз, когда я возвращаюсь и снова воспроизвожу видео или другое видео.

enter image description here

Я пробовал использовать инструменты с утечками, но еще не смог понять, что с ним не так.

Сохраняет весь файл контроллера 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");
}
4b9b3361

Ответ 1

Проблема была в idleTimer. Когда метод invalidate вызывается на idleTimer, он не синхронно отменяет таймер, вместо этого он ожидает следующего тика (не уверен, но ждет некоторое время), прежде чем он недействителен и освободит его.

Теперь, в то время, ссылка idleTimer устанавливается на nil. На следующем тике таймера ссылка теряется и память никогда не отпускается, и ссылки распространяются полностью до ViewController, и ни один из ее объектов не освобождается.