Я застрял в какой-то странной проблеме утечки памяти, связанной с AVAudioPlayer, и мне нужна помощь после того, как я попробовал все, что пришло в голову.
Вот краткое описание проблемы - код появляется сразу после.
Я инициализирую свой плеер и начинаю воспроизводить звуковую дорожку в бесконечном цикле (и бесконечный цикл или однократное воспроизведение не изменили проблему).
Через несколько секунд после запуска музыки я переключаюсь на другую звуковую дорожку, поэтому создаю новый проигрыватель, инициализирую его, освобождаю старый (воспроизводящий), а затем устанавливаю новый на место и воспроизводю его.
В этот момент времени (сразу после того, как я позвонил новому игроку - [Воспроизведение игрока]), я получил утечку памяти (размером 3,5 КБ).
Я попробовал следующее:
Остановите старого игрока и затем отпустите его - без эффекта
Отпустить проигрыватель сразу после инструкции по воспроизведению - воспроизведение не началось
Отпустите дважды старого игрока - сбой
Утечка памяти НЕ происходит, когда я создаю и играю первым игроком!
Кроме того, в справочнике говорится, что «игра» асинхронна, и поэтому, вероятно, она увеличивает количество ссылок на 1, но в этом случае почему [Player stop] не помогло?
Спасибо
Вот некоторые части кода о том, как я его использую:
- (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;
}