I don't know about the iPhone in particular, but I may still be able to help:
Instead of simply plugging in a fixed delay at the end of the loop, use the following:
- Determine a refresh interval that you would be happy with and that is larger than a single pass through your main loop.
- At the start of the loop, take a current timestamp of whatever resolution you have available and store it.
- At the end of the loop, take another timestamp, and determine the elapsed time since the last timestamp (initialize this before the loop).
- sleep/delay for the difference between your ideal frame time and the already elapsed time this for the frame.
- At the next frame, you can even try to compensate for inaccuracies in the sleep interval by comparing to the timestamp at the start of the previous loop. Store the difference and add/subtract it from the sleep interval at the end of this loop (sleep/delay can go too long OR too short).
You might want to have an alert mechanism that lets you know if you're timing is too tight(i,e, if your sleep time after all the compensating is less than 0, which would mean you're taking more time to process than your frame rate allows). The effect will be that your game slows down. For extra points, you may want to simplify rendering for a while, if you detect this happening, until you have enough spare capacity again.