目次

翻訳元:Code Loading Programming Topics: CFBundle and NSBundle

CFBundleとNSBundle

本章ではロード可能バンドルを操作するCocoaのクラスNSBundleと、NSBundleの基礎となっているCore FoundationのCFBundle不透明型の関係について説明します。 アプリケーションでロード可能バンドルの使用を計画している全ての人にとって、この関係は重要な予備知識です。

Core FoundationのCFBundle

Core FoundationのCFBundle不透明型はバンドル操作用のMac OS Xの基底APIです。 CFBundleプログラミングインタフェースは、実行可能形式、リソース配置アルゴリズム、情報プロパティリストからのデータ展開といった独特な操作の直接的な扱いから、開発者を解放します。

CFBundle不透明データ型により、アプリケーションでバンドルリソースとコードの利用が可能になります。 バンドルの場所を与えてCFBundleを初期化すると、CFBundleの様々なルーチンを使ってバンドルの中身にアクセスすることができます。 ルーチンに含まれる機能は以下のような物があります。

動的読み込みルーチンは、サポートする実行可能形式の動的ローダーとの細かなやり取りの全てを担当するので、これらについて気にする必要はありません。 読み込み(loading)と解放(unloading)のコードは、CFBundleLoadExecutableCFBundleUnloadExecutableを使って、必要とするバンドル用にCFBundleオブジェクトを初期化するだけで良いのです。

Cocoaアプリケーションでは、実行コードの読み込み(loading)と解放(unloading)にCFBundleルーチンを使うべきではありません。 なぜならば、CFBundleはObjective-Cランタイムをネイティブ対応していないからです。 NSBundleはランタイムシステムにObjective-Cシンボルを正しく読み込みますが、ランタイムの制限により一度読み込まれたCocoaバンドルをアンロードする方法はありません。 しかしながら、Cocoaバンドル用にCFBundleオブジェクトを生成し、読み込み・解放以外のCFBundleルーチンは支障なくなく使うことが出来ます。

APIリファレンスを含むCore Foundationバンドルに関する詳しい情報は、Core Foundationのプログラミング記事であるBundle Programming Guideをご覧下さい。

NSBundle

NSBundleはバンドル管理の全権を持つCocoaクラスです。 NSBundleのメソッドはCFBundleのルーチンがモデルとなっており、その多くは対応するCFBundleルーチンを呼び出します。 その一方で注意すべきは、他のCore Foundationの型とFoundationの関係と違い、NSBundleのポインタはCFBundleRefにキャスト出来ない──つまり、これらはtoll-freeブリッジではないのです。

殆どのメソッドにおいて、NSBundleは自身の仕事をこなすのに適したCFBundleルーチンを単に呼び出すだけですが、読込みコードは事情が違います。 なぜならば、CFBundleはObjective-Cシンボルを扱えないので、NSBundleは読込みコードに別のメカニズムを使わなければならないのです。 的確なロード、全てのCocoaクラスとバンドル内の実行可能ファイルの実行コードの登録のために、NSBundleはObjective-Cランタイムシステムとやり取りします。

少なくとも、Cocoaバンドルは1つのクラス──主要クラス(principal class)を持ち、これはバンドルへのエントリーポイントとして働きます。 主要クラスについての議論はloadable_bundles_in_cocoaをご覧ください。

Objective-Cランタイムシステムの制限により、NSBundleは実行可能コードを解放(unload)することが出来ません。 CFBundleはObjective-Cシンボルを認識しないので、CFBundleの読込み(loading)・解放(unloading)ルーチンのNSBundleオブジェクトに対する使用は禁止です。 しかしながら、Cocoaバンドル用にCFBundleオブジェクトを生成することは出来、読込みと解放に関係しないその他のルーチンについては問題なく使用出来ます。