2009-12-11

Cocoa アプリ の構造 #1: Nib の周辺

Cocoa アプリでは、アプリが利用するさまざまなリソースを Nib ファイルに保持している。この中には、アイコン等の画像データに加えて、メニューやウィンドウといったユーザインターフェースの記述もふくまれている。アプリによっては、複数の Nib ファイルを持つものもあり、当然、どの Nib をどういうタイミングでロードするのかを制御する仕組みが存在する。この仕組みが気になり少し調べてみたので、わかった範囲で記録しておく。

アプリと Nib の関係

Cocoa アプリのスタートポイントは NSApplicationMain 関数で、その処理は主に次の 3 つ。

  1. NSApplication のオブジェクトを作ること (グローバル変数 NSApp にセットされる)
  2. アプリの主要 Nib ファイルをロードすること
  3. NSApprun メッセージを送ること

今回、ふと気になって調べたのがこの 2 番目。Nib ファイルのロードについて。具体的には、どの Nib ファイルが、いつロードされるのか、また、そのトリガーは何なのか、など。ちなみに Xcode/Interface Builder 3.0 以降は、デフォルトでバイナリ形式の Nib に代わって XML 形式の「Xib ファイル」が使われる。SCM ツール等との相性の良いテキスト形式のフォーマットを作ったとのこと。ビルドの際に Nib へと変換される。([4]を参照)

まずは、アプリに対して 1 つ存在する「主要 Nib ファイル」というものについて。これはどこで指定しているんだろうか? Xcode で Cocoa アプリ用のプロジェクトテンプレートを指定すると、MainMenu.xib が作られ、これが主要 Nib になる。まさか、ファイル名がハードコードされているはずもないから、どこかに名前の指定があるはず。

主要Nibファイルの設定

[2] の "Changing the Nib Files from the Xcode Defaults" の記述でそれが判明した。Xcode からプロジェクトのターゲットからアプリケーションを選び、「ファイル」>「情報を見る」。「情報」パネルの「プロパティ」タブを開くと、中段に「主要クラス」と「主要Nibファイル」の設定がある (右図)。

ちなみに、これら「プロパティ」の設定は、Info.plist としてアプリにくっついて行く。

MyDocument と Nib の関係

Xcode で document-based アプリ用プロジェクトを作る

Cocoa アプリのプロジェクトを作る際に "document-based application" を指定すると、Document-Based アプリ([3]を参照)を作ることができる。このとき、Xcode が自動生成する Nib ファイルは MainMenu.xibMyDocument.xib の 2 つ。前者は上述のようにアプリの「主要 Nib ファイル」だ。後者はファイルを作成、編集する際に表示するユーザインターフェースを記述するためのもの。では、MyDocument.xib はいつ(何をきっかけとして)、誰が(どのオブジェクトが) ロードするのか? その答えも [3] に書かれていた。以下は、プロジェクトテンプレートが想定する、もっともシンプルな場合の動きだ。

Document-Based アプリでは、NSDocumentController というオブジェクトが存在し、ドキュメントの作成やオープンを担当している。メインメニューからファイルの新規作成やオープンが選択されると、NSDocumentController に指示が届く。で、このオブジェクトは生成する(開く)ドキュメントのタイプに応じて、適切なクラス(NSDocumentのサブクラス; デフォルトでは MyDocument)のオブジェクトを生成する。このオブジェクトとドキュメント編集のための Nib ファイル(MyDocument.xib) との結び付きは、MyDocumentwindowNibName メソッドが返す文字列によって作られる。デフォルトではこれが "MyDocument" となっている。

さて、では NSDocumentController はドキュメントのタイプと MyDocument クラスをどこで結び付けているのだろうか? それも、Info.plist だ。その中で、ドキュメントタイプごとに拡張子やアイコン等と一緒にクラスも指定する。

関連リンク

ちなみに以下のリンクはすべて Mac Dev Center の文書なので、Xcode のドキュメントブラウザからも読める。

[1] Cocoa Fundamentals Guide: The Core Application Architecture on Mac OS X
後ろの方にある "Nib Files and Other Application Resources" が Nib 関連の記述。
[2] Resource Programming Guide: Nib Files
"Anatomy of a Nib File" では、Interface Builder でおなじみの「File's Owner」や「First Responder」の説明がある。
[3] Document-Based Applications Overview: Implementing a Document-Based Application
"The Document-Based Application Project Template" に、Xcode の Document ベースアプリのプロジェクトテンプレートの説明がある。
[4] Interface Builder User Guide: Nib File Management
Nib と Xib の違いについての説明がある。なぜ、Xib ファイルを使うようになったのか、等。

参考文献

ヒレガス本 p.157 に "The Document Architecture" に document-baseed アプリについての簡単な説明がある。ただ、Nib ファイルのことはほとんど何も書いていない。ここに書いていないから、本家のドキュメントを調べたのだ。

Cocoa Programming for Mac OS X
Aaron Hillegass
Addison-Wesley Professional ( 2008-05-15 )
ISBN: 9780321503619
おすすめ度:アマゾンおすすめ度

関連記事

0 件のコメント:

コメントを投稿