Утечка памяти в 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");
}
Ответы
Ответ 1
Проблема была в idleTimer. Когда метод invalidate вызывается на idleTimer, он не синхронно отменяет таймер, вместо этого он ожидает следующего тика (не уверен, но ждет некоторое время), прежде чем он недействителен и освободит его.
Теперь, в то время, ссылка idleTimer устанавливается на nil. На следующем тике таймера ссылка теряется и память никогда не отпускается, и ссылки распространяются полностью до ViewController, и ни один из ее объектов не освобождается.