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