plz は、principalClass が何に使用されるかを理解するのを手伝ってくれますか?その構文は何ですか? 私はそれがNSBundleクラスにあることを理解していますが、ロード可能なバンドルのみに固有のバンドル用に作成できますか? plzはprincipalClassの概念を知るのを手伝ってくれます.
ありがとうございます。
バンドルをプラグインとして作成してロードする方法の例を示します。これが大いに役立つことを願っています。私は他の2つの(これまでのところ)答えに同意すると言わなければなりません。そう...
Xcode プロジェクトを「バンドル」として作成します (Xcode 3.2.6 では、[新しいプロジェクト] -> [フレームワークとライブラリ] -> [バンドル] を選択します)。次のファイルを作成します...
PClass.h
#import <Foundation/Foundation.h>
@interface PClass : NSObject {
}
- (NSString*) stringMessage;
@end
PClass.m
- (NSString*) stringMessage {
return @"Hallo from plugin";
}
プロジェクトの .plist ファイルに、次の 2 つのエントリを追加します。
「バンドル表示名」「MyPlugin」
「プリンシパルクラス」「PClass」
次に、プロジェクトをコンパイルし、バイナリ (.../build/Debug/yourPlugin.bundle) を、自分のプロジェクトのプラグインを保存したいフォルダーに移動します (少し余分に aProject.app/Plugins/ にコピーできます)。お手入れ)。
次に、既に Xcode プロジェクトに以下を追加します。
- (void) loadPlugin {
id bundle = [NSBundle bundleWithPath:@"the path you/placed/yourPlugin.bundle"];
NSLog(@"%@", [[bundle infoDictionary] valueForKey:@"CFBundleDisplayName"]);
// Here you can preview your plugins names without loading them if you don't need to or just to
// display it to GUI, etc
NSError *err;
if(![bundle loadAndReturnError:&err]) {
// err
} else {
// bundle loaded
Class PluginClass = [bundle principalClass]; // here is where you need your principal class!
// OR...
//Class someClass = [bundle classNamed:@"KillerAppController"];
id instance = [[PluginClass alloc] init];
NSLog(@"%@", [instance stringMessage]);
[instance release]; // If required
[bundle unload]; // If required
}
}
アプリケーションのプラグインとして、プリンシパル クラスを介してバンドルをロードしました。
バンドルの「プリンシパル クラス」は、バンドルのプライマリ クラスとしてマークされている目的の C クラスにすぎないため、バンドル インスタンスの -principalClass メソッドによって返されます。
それ以上でもそれ以下でもなく、魔法もありません。
ロード可能なバンドルのみが新しい Objective-C クラスを定義するため、ロード可能なバンドルに対してのみ存在します。
principalClass を使用すると、バンドルをロードした後に使用を開始するクラスを知ることができます。たとえば、画像処理アプリのプラグインを表すためにバンドルを使用しているとします。Objective-C ランタイムにバンドル「CSISharpener.bundle」をロードするように指示すると、多数の新しいクラスがメモリにロードされます。ただし、プラグインを実際に使用するには、メッセージを送信するクラスの名前を知る必要があります。
この例では、principalClass は CSISharpeningFilter を返す場合があります。これは、プラグイン開発者に使用するように指示したプラグイン プロトコルに準拠しています。そのため、事前にクラス名を知らなくても、「principalClass」のインスタンスを作成して使用を開始できます。
つまり、principalClass は、プログラムがバンドルをロードし、ロードしたばかりのコードへの「エントリ ポイント」を簡単に見つけることができるようにするために存在します。正確に何に使用されるかは、どのコードがバンドルをロードしているか、およびそれを何に使用しているかによって異なります。