Utknąłem na jakimś dziwnym problemie z wyciekiem pamięci związanym z odtwarzaczem AVAudioPlayer i potrzebuję pomocy po wypróbowaniu wszystkiego, co przychodziło na myśl.Awaria pamięci AVAudioPlayer
Oto krótki opis problemu - kod pojawia się zaraz po. Inicjuję odtwarzacz i zaczynam odtwarzać ścieżkę dźwiękową w nieskończonej pętli (i niekończącej się pętli lub jeden raz gra nie zmieniła problemu). Kilka sekund po uruchomieniu muzyki przełączam się na inną ścieżkę dźwiękową, dlatego tworzę nowego gracza, inicjalizuję go, zwalniam stary (który jest odtwarzany), a następnie ustawiam nowy na miejscu i odtwarzam.
W tym momencie (zaraz po wywołaniu nowego odtwarzacza - [Odtwarzanie odtwarzacza]) dostaję wycieku pamięci (3,5Kb).
Próbowałem następujące:
Zatrzymaj stary odtwarzacz, a następnie zwolnić go - nie wpływa
Zwolnij gracza tuż po instrukcji Play - nie rozpocząć odtwarzanie
Zwolnij dwa razy starszego odtwarzacza - crash
Przeciek pamięci NIE występuje, gdy tworzę i odtwarzam pierwszy gracz!
Również w odniesieniu to nie znaczy, że „gra” jest asynchroniczny i tak prawdopodobnie zwiększa licznik ref 1, ale w tym przypadku, to dlaczego nie [Player stop] pomóc?
Dzięki,
Oto niektóre części kodu o tym, jak go używać:
- (void) loadAndActivateAudioFunction {
NSBundle *mainBundle = [NSBundle mainBundle];
NSError *error;
NSURL *audioURL = [NSURL fileURLWithPath:[mainBundle pathForResource: Name ofType: Type]];
AVAudioPlayer *player = [(AVAudioPlayer*) [AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];
if (!player) {
DebugLog(@"Audio Load Error: no Player: %@", [error localizedDescription]);
DuringAudioPrep = false;
return;
}
[self lock];
[self setAudioPlayer: player];
[self ActivateAudioFunction];
[self unlock];
}
- (void) setAudioPlayer : (AVAudioPlayer *) player {
if (Player)
{
if ([Player isPlaying] || Repeat) // The indication was off???
[Player stop];
[Player release];
}
Player = player;
}
- (void) ActivateAudioFunction {
[Player setVolume: Volume];
[Player setNumberOfLoops: Repeat];
[Player play];
DuringAudioPrep = false;
}
Dzięki za odpowiedź. Tak - potwierdziłem, że jest to AVAudioPlayer with Instruments. Co do metody - używam tego, ponieważ faktycznie zapisuję różne ścieżki i ponownie je wykorzystuję, dopasowując nazwy i jeśli one nie grają (zamiast kilkukrotnego pobierania tej samej ścieżki). Ponieważ wiem, że dostanę zawodnik z rozmówcą po robi „Alloc” na to, wiem, że jest już zachowane (chyba że to źle?) – Adi