Objective-Cアプリケーションが起動すると、main()という名前の関数を実行することから起動します。ファイル「main.m」にある必要はありませんが、Xcodeウィザードが設定する方法です。
ウィザードで生成されたmain()関数の中には、次の行があります。
int retVal = UIApplicationMain(argc, argv, nil, nil);
これが、アプリケーション全体を構成する「UIKit」フレームワークの始まりです。UIApplicationMain内に、タイプUIApplicationのオブジェクトが作成されます。また、アプリケーションの起動時にUIApplicationが行うことの一部は、UIApplicationクラスのデリゲートメンバーでapplicationDidFinishLaunchingWithOptionsメソッドを呼び出すことです。このデリゲートは、MainWindow.xibファイルで、UIApplicationDelegateプロトコルに準拠するNSObjectのサブクラスであるProjectAppDelegateクラスのインスタンスとして設定されます。
AppDelegateに最初に実行するように促すものは...
MainWindow.xibファイルで接続したため(プロジェクトウィザードが実際に接続を行いました)、ファイルの所有者(UIApplicationオブジェクト)の「デリゲート」アウトレットを.xibファイルのUIApplicationDelegateオブジェクトとクラスに接続しました。 UIApplicationDelegateのは、アプリのUIApplicationDelegateサブクラスに設定されます。
また、「MainWindow.xib」には魔法はありません。「Foo.xib」と呼ぶことができます。重要なのは、Info.plistファイルの「Mainnibfilebasename」というプロパティが「MainWindow」であるということです。MainWindow.xibの名前をFoo.xibに変更し、Info.plistの「Mainnib file base name」を「Foo」に変更しようとすると、引き続き機能することがわかります。
編集:RootControllerの詳細
繰り返しますが、いわゆる「RootController」には何の魔法もありません。これは、Xcodeの新しいプロジェクトウィザードによって作成されたUIViewControllerサブクラスの名前にすぎません。
ウィザードは、ProjectAppDelegateとProjectViewControllerの2つのクラスのコードをプロジェクトに配置します。ProjectAppDelegateクラスには、次の2つのアウトレットメンバーが含まれています。
IBOutlet UIWindow *window;
IBOutlet ProjectViewController *viewController;
MainWindow.xibファイルでは、UIWindowとProjectViewControllerの両方のインスタンスが配置され、ProjectAppDelegateの上記のアウトレットに接続されます。
画面に表示されるのは、ProjectAppDelegateクラスの次のコードです。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
return YES;
}
繰り返しになりますが、これについて本当に魔法のようなものは何もありません。プロジェクトウィザードは、「ルート」ViewControllerのビューをウィンドウのビューに追加し、ウィンドウを表示するコードを作成しました。「ルート」ビューコントローラーは.xibファイルに作成され、ProjectAppDelegateアウトレットに接続されました。
ウィザードのファイルを使用せずに、完全に自分でアプリケーションを作成することは非常に有益です。.xibファイルがどのように機能し、それらがコードオブジェクトにどのように関連するかについて多くを学びます。