Using prepareToPlay on the AVAudioPlayer instance will preload the sound file. Maybe you could load some reasonable number of them into an array and then cycle through them as needed. If you needed more than the number allocated then you choose at that time to load a new one into memory, or start the first one in the list playing again. A more complicated system could store up more or less sounds in the array based on factors or what's happening in the app.
Maybe something like this? (I've left out error checks and what not for the sake of brevity)
//setup the managing class to be
//<AVAudioPlayerDelegate>
///--- instance variables or properties
int nextIndexToPlayInArrayOfSounds = 0;
NSMutableArray *arrayOfSounds = [NSMutableArray array];
int numberOfSoundsNeeded = 10;
//make a method to setup the sounds
for (int i = 0; i < numberOfSoundsNeeded; i++) {
AVAudioPlayer *mySound = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"soundNameOnDisk"] withExtension:@"aiff"] error:NULL];
mySound.delegate = self;
[arrayOfSounds addObject:mySound];
[mySound prepareToPlay];
}
//make a method to play a sound
//and then play the next sound in the list, or if past the end of the array, or play the first one
AVAudioPlayer *nextSoundToPlay;
if (numberOfSoundsNeeded > nextIndexToPlayInArrayOfSounds) {
nextIndexToPlayInArrayOfSounds++;
}else{
nextIndexToPlayInArrayOfSounds = 0;
}
//obviously I'm skipping error checking and nil pointers, etc
nextSoundToPlay = [arrayOfSounds objectAtIndex:nextIndexToPlayInArrayOfSounds ];
[nextSoundToPlay playAtTime:0];