translation:adc:cocoa:foundation:introduction_to_dynamically_loading_code:0400_cfbundle

CFBundleとNSBundle

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

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

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

  • 実行可能コードの動的読み込みと解放(unloading)
  • 画像、nibファイル、文字列といったローカライズ済みと未ローカライズ、両方のリソース置き場の検索
  • ローカライズ済みと未ローカライズ、両方の情報プロパティリストの値へのアクセス
  • バンドルの実行可能コードに含まれる、関数やデータへのポインタの検索

動的読み込みルーチンは、サポートする実行可能形式の動的ローダーとの細かなやり取りの全てを担当するので、これらについて気にする必要はありません。 読み込み(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はバンドル管理の全権を持つ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オブジェクトを生成することは出来、読込みと解放に関係しないその他のルーチンについては問題なく使用出来ます。

  • translation/adc/cocoa/foundation/introduction_to_dynamically_loading_code/0400_cfbundle.txt
  • 最終更新: 2020-12-04 13:31
  • by Decomo