2014-07-18 15 views
10

Użyłem próbki AVPlayerDemo z Apple docs i napisałem na niej mój własny interfejs do odtwarzania filmów wybranych z UITableViewController. Problem polega na tym, że gdzieś tu jest wyciek pamięci, którego nie mogę się dowiedzieć. Problem polega na tym, że obiekt AVPlayer nie jest zwolniony, domyślam się, że za każdym razem, gdy naciskasz przycisk Wstecz i wybierasz nowe wideo do odtwarzania, następuje ogromny skok w całkowitej ilości pamięci zużywanej przez aplikację, która jest tutaj pokazana:Przeciek pamięci w iOS, AVPlayer nigdy nie jest wycofywany

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

pierwszy raz film jest gracz, użycie pamięci jest 36.6MB, teraz po raz drugi:

Here it has jumped to 58.2MB

Tutaj skoczył do 58.2MB, i ciągle rośnie z każdym czas wracam i ponownie odtwarzam film lub inny film.

enter image description here

Próbowałem za pomocą instrumentów o Przecieki, ale jeszcze nie były w stanie zorientować się, co jest nie tak z nim.

Oto cały plik kontrolera 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

Przepraszam, ale nikt nie przejdzie przez cały plik ... musisz go zawęzić poprzez debugowanie kilku innych elementów (np. Wyłączyć niektóre funkcje i spróbować ponownie lub użyć widoku przydziału na instrumentach, aby określić, skąd się bierze zatrzymany, itp.) – borrrden

+0

Wiem, właśnie dodałem całość, tak że nie pomijam niczego, co może powodować wycieki. Po prostu skopiuję odpowiedni kod i wkleję go tutaj. –

+0

@FarazHassan próbowałeś zgłosić bilet do Apple? – CAMOBAP

Odpowiedz

1

Problem był z idleTimer. Gdy metoda unieważniająca jest wywoływana w idleTimer, nie synchronicznie unieważnia licznik czasu, zamiast tego czeka na następny znacznik (nie jest pewien, ale czeka na jakiś czas) przed unieważnieniem i zwolnieniem go.

Teraz, w międzyczasie, odniesienie do idleTimer jest ustawione na zero. Przy następnym haczyku licznika, odniesienie zostanie utracone, a pamięć nigdy nie zostanie zwolniona, a odniesienia będą się rozprzestrzeniać do narzędzia ViewController i żaden z jego obiektów nie zostanie zwolniony.