Here is my current approach to testing before shipping an app.
1) Build and analyze using the Xcode integrated Clang analyzer.
This is helpful in many ways, it catches many little stupid things and also some memory leaks (even though sometimes its results contain false positives).
2) Check thoroughly all of the warnings. Some of them may actually be really harmful. Remove the warnings where possible.
3) Use Instruments to check for memory leaks, memory footprint at runtime, etc.
4) Use Shark to identify performance problems when I feel it is needed.
5) Execute (manually) all of a predefined series of tests, to check that both the UI and the underlying code works as expected. When adding new functionalities to an app, always do regression tests again to ensure everything runs smoothly and properly. I have discarded unit tests a long time ago, due to the unbelievable amount of time needed to setup and run them.
6) Ship an ad hoc version of the app to alpha testers, correct bugs reported, then ship the app again to both alpha and beta testers and correct bugs reported.
7) Final test done personally on different devices, at the moment iPhone 3GS, iPhone 3G and iPod Touch.