Из вашего фрагмента кода, audioPlayer
должен быть иваром, верно?
В верхней части метода вы вызываете -prepareToPlay
для существующего экземпляра audioPlayer
(который может быть равен нулю, по крайней мере, при первом проходе).
Позже в этом методе вы заменяете этот существующий аудиоплеер новым экземпляром AVAudioPlayer. Предыдущий -prepareToPlay
потрачен впустую. И вы теряете память с каждым новым AVAudioPlayer.
Вместо кэширования звуковых данных или URL-адресов, я бы попытался создать кэш объектов AVAudioPlayer, по одному для каждого звука. В вашем методе -playSound:
получите ссылку на соответствующий аудиоплеер для строки таблицы и -play
.
Вы можете использовать -tableView:cellForRowAtIndexPath:
в качестве подходящей точки для получения экземпляра AVAudioPlayer для этой строки, возможно, лениво создавая экземпляр и также кэшируя его там.
Вы можете попробовать -tableView:willDisplayCell:forRowAtIndexPath:
как точку, в которой вы бы вызвали -prepareToPlay
в экземпляре AVAudioPlayer строки.
Или вы можете просто подготовиться в -tableView:cellForRowAtIndexPath:
. Поэкспериментируйте и посмотрите, что работает лучше всего.