5

私のアプリケーションには、ユーザーが実行時にロードされる独自のプラグインを作成できるプラグインシステムがあります。通常、これは問題ありませんが、場合によっては、2つのプラグインが同じライブラリを使用するため、これら2つのプラグイン間で衝突が発生します。

例:

プラグインAはJSONを操作するためにTouchJSONを使用したいので、作成者はTouchJSONコードをプラグインソースに追加し、コンパイルされてプラグインバイナリにリンクされます。後でプラグインBも同じライブラリを使用したいと考えており、まったく同じことを行います。これで、アプリがこれら2つの異なるプラグインをロードすると、これが検出され、次のような警告が表示されます。

クラスCJSONScannerは、[path_to_plugin_a]と[path_to_plugin_b]の両方に実装されています。2つのうちの1つが使用されます。どちらが未定義です。

私のアプリはプラグインをロードするだけで、それらが特定のプロトコルに準拠していることを確認するため、ロードするプラグインと、2つ以上が同じライブラリを使用するかどうかを制御できません。

両方のプラグインがまったく同じバージョンのライブラリを使用している限り、これはおそらく機能しますが、1つのプラグインでAPIが変更されるとすぐに、多くの問題が発生します。

これについて私にできることはありますか?

4

2 に答える 2

4

バンドルロードシステムは、名前の競合を平和的に解決する手段を提供しません。実際、問題が発生した場合の対処方法ではなく、問題が発生しないようにするように言われています。(明らかに、あなたの場合、それは不可能です)。

この問題についてバグレポートを提出することができます。

これがアプリケーションにとって絶対に重要な場合は、バンドルを別々のプロセスに配置し、ある種のIPCを使用NSDistantObjectして、プログラムからプラグインホストにデータを渡すことができます。ただし、これは大きな問題であると確信しているため、さまざまなプロセスへの配布を可能にする明確に定義されたインターフェイスがない場合は、かなりの作業になる可能性があります。

于 2011-06-14T14:13:23.670 に答える
2

単一プロセス モデルでは、これに対処する唯一の方法は、共有コード (より正確には、共有の Objective-C クラス) が 1 回読み込まれるようにすることです。これを行うには、次の 2 つの方法があります。

  • 共有コードをフレームワークに入れます。
  • 共有コードを読み込み可能なバンドルに入れ、関連するクラスがまだ利用可能でない場合は、プラグインが読み込まれるときにバンドルを読み込みます (を使用して確認してくださいNSClassFromString())。クライアント コードもNSClassFromString()、クラスを直接参照するのではなく、使用する必要があります。

もちろん、プラグインを制御できない場合、これらのスキームのいずれかを強制することはできません。あなたができる最善のことは、適切なガイドラインと、場合によってはインフラストラクチャを提供することです。たとえば、2 番目のケースでは、おそらくチェックするクラスを指定し、プラグインのInfo.plistで利用できない場合にロードする組み込みバンドルの名前を指定することによって、ロードをアプリケーションで処理できます。

于 2011-06-14T14:32:45.150 に答える