4

再利用できるように設計されたクラスを作成していますが、コンパイル時に常に使用できるとは限らないクラスへの呼び出しを含めました。

具体的に言うと、私は Flurry 分析を使用しており、その呼び出しを含めたいのですが、このモジュールが含まれている可能性のあるすべてのプロジェクトが Flurry ライブラリにアクセスできるわけではありません。これらのコードのビットでコンパイルしないようにしたいだけです。状況。モジュールはソース コードとして配布されるため、コンパイル時にテストするだけで済みます。

これまでのところ、私は試しました:

if([Flurry class]){
    [Flurry logEvent:@"Blah"];
}

これは「未定義の識別子の使用」に失敗します-ライブラリへの弱い参照がないため、フラリーはどこにも定義されていません

次に試してみました:

Class flurryClass = NSClassFromString(@"Flurry");
if(flurryClass){
  [flurryClass logEvent:@"Blah"];
}

これは、「セレクター logEvent の既知のクラス メソッドがありません」として失敗します。

最初の方法は、弱いリンクが利用できない可能性のあるライブラリの弱いリンクに依存しているため、行き詰まっているようです! 現在定義がないクラスでクラスメソッドを呼び出しているため、コンパイラが文句を言うので、2番目のメソッドは失敗すると思いますか? 誰でも考えられる解決策はありますか?

4

2 に答える 2

9

全体を通してリフレクションを使用する必要があります。コードを次のように変更します。

Class flurryClass = NSClassFromString(@"Flurry");
if(flurryClass){
  [flurryClass performSelector:@selector(logEvent:) withObject:@"Blah"];
}
于 2013-03-06T20:19:45.323 に答える
3

私はあなたの図書館が他人の許可なしに他人のアカウントに突風イベントを自動的に記録することを避けたいと思います。プリプロセッサチェックを行い、実装者にFlurryを明示的に有効にするように要求することをお勧めします。

#if MYLIB_ENABLE_FLURRY

    if([Flurry class]){
        [Flurry logEvent:@"Blah"];
    }

#endif //MYLIB_ENABLE_FLURRY

これで、誰かがライブラリからログを追加したい場合は、Flurryが必要であることを指示し-DMYLIB_ENABLE_FLURRY=1、ソースが直接含まれている場合は、他のCフラグを使用してライブラリをコンパイルするか追加することができます。

于 2013-03-06T20:44:16.843 に答える