Good questions. Our SpeakLineAppDelegate instance is created by the xib/nib file, so -init is called as soon as the MainMenu nib is unarchived. Note how the project template put a blue object in the xib file (“Speak Line App Delegate”) – any object in the interface builder dock (except the placeholders at the top, such as File’s Owner and First Responder) is instantiated by the nib file.
Personally, I avoid creating controller classes this way, as I prefer the more explicit style. Oftentimes, in my apps, the app delegate will be the only controller class created in this fashion.
In the SpeakLine app it’s fine to create the speech synth in either place. If, however, you had tried to initialize _voices in -applicationDidFinishLaunching:, you would find that the table is not populated. The reason is that the table loads its contents for the first time before -applicationDidFinishLaunching:. So -init is a better choice. -awakeFromNib would work as well.
So because -applicationDidFinishLaunching: is called after -init and -awakeFromNib, each is appropriate for certain types of initialization, although the lines are blurry in many cases. If you have any setup for your app delegate that other objects are going to be depending on, I’d suggest doing those steps in -init. -applicationDidFinishLaunching: is a good place to do any final steps in the app startup sequence, such as displaying a first run window.