Я опубликовал гораздо более длинный вопрос несколько минут назад, и, как правило, сразу после его публикации я понял, что происходит, поэтому я удалил его, так как большая часть сообщения была неактуальной. Затем я вернулся в Google.
Оказывается, у меня почти та же самая проблема, которая описана в этом посте, без ответа с июня. http://www.iphonedevsdk.com/forum/iphone-sdk-development/20975-avaudioplayer-nsurl-memory-management.html
В итоге: я использую AVAudioPlayer и освобождаю его с помощью audioPlayerDidFinishPlaying: успешно: метод делегата. После того, как я инициализирую проигрыватель, связанный с ним объект NSURL должен быть освобожден, иначе он протекает. Но когда я отпускаю его после инициализации плеера, он падает, так как он уже освобожден. Странно то, что он не всегда падает в первый раз, в большинстве случаев он падает после воспроизведения второго звука. Иногда (редко) это позволяет распределять / освобождать несколько игроков (я снова использую указатели после освобождения) перед сбоем. Любая помощь?
Фрагмент кода: (soundKeyUp - переменная класса AVAudioPlayer *, следовательно, здесь нет объявления)
NSString *soundKeyUpPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"soundKeyUp%d", key.tag % 5] ofType:@"wav"];
NSURL *soundKeyUpURL = [[NSURL alloc] initFileURLWithPath:soundKeyUpPath];
soundKeyUp = [[AVAudioPlayer alloc] initWithContentsOfURL:soundKeyUpURL error:nil];
if(soundKeyUp) {
[soundKeyUp setDelegate:self];
[soundKeyUp play];
}
else {
[soundKeyUp release];
soundKeyUp = nil;
}
[soundKeyUpPath release];
[soundKeyUpURL release];
Ответ Стиву Риггинсу:
Хитрость в том, что он не падает каждый раз в одно и то же время, как уже упоминалось. Он почти всегда правильно выпускается в первый раз (или, по крайней мере, он не падает или не просачивается), но обычно после второго раза, когда я выделяю / освобождаю плеер и URL, происходит сбой при освобождении URL. Иногда перед сбоем проходит 3, 4, 5+ раз, но это всегда так.