2011-01-25 11 views
8

Mac OS XおよびiOS用のクラスライブラリを、OS X用のCocoaフレームワークとiOS用の静的ライブラリとしてリリースする予定です。問題を単純化するために、私はXcodeで複数のターゲットを使用するつもりです。しかし、Mac OS XのクラスはCocoa.hとリンクしていますが、iOSではFoundation.hとリンクしています。MacとiOS用に異なるヘッダファイルをインポートするためにプリプロセッサディレクティブを使用できますか?

私の質問は基本的には、次のとおりです。

  • Foundation.frameworkに対してはMac OS Xのフレームワークのリンクではなくてもらえますか?フレームワーク内で使用されるクラスは、NSString、NSMutableString、およびNSMutableArrayです。
  • フレームワークの組み込みを制御するために、ヘッダファイル内にプリプロセッサディレクティブを使用できますか?

    #ifdef MacOSX 
        #import <Cocoa/Cocoa.h> 
    #else 
        #import <Foundation/Foundation.h> 
    #endif 
    
+0

このhttp://stackoverflow.com/questions/3181321/which-conditional-を見てみましょうMac-and-iphone-specific-code間のコンパイルから使用への切り替え – detunized

答えて

20

あなたは(TargetConditionals.hを参照)別のプラットフォーム依存のコードにこれらを使用することができます。

#ifdef TARGET_OS_IPHONE 
    // iOS 
#elif defined TARGET_IPHONE_SIMULATOR 
    // iOS Simulator 
#elif defined TARGET_OS_MAC 
    // Other kinds of Mac OS 
#else 
    // Unsupported platform 
#endif 

ここuseful chartです。

+3

私は少しのテストを行い、それに応じてコードを修正しました。明らかに、 'TARGET_OS_MAC'もiOS用に定義されています。ベストは 'TargetConditionals.h'を見て、あなたのニーズに合ったマクロを見てください。それらのかなりの数があります。 – detunized

+1

私は '#ifdef'の代わりに' #if TARGET_OS_IPHONE'を使う必要があると思います。 –

+3

この回答は間違っています。いくつかの問題があります:まず、 'TARGET_OS_IPHONE'が常に定義されます。時には0と定義されていますが、まだ定義されています。 'TARGET_IPHONE_SIMULATOR'と同じです。しかし、 'TARGET_IPHONE_SIMULATOR'も' TARGET_OS_IPHONE'も1でなければ決して1になりません。具体的にiOSシミュレータを確認する必要がある場合は、まずチェックを行う必要があります: '#if TARGET_IPHONE_SIMULATOR' /' #elif TARGET_OS_IPHONE'/'#elif TARGET_OS_MAC' /' #endif'。 –

2
  • 代わりFoundation.frameworkに対してはMac OS Xのフレームワークのリンクだろうか?フレームワーク内で使用されるクラスは、NSString、NSMutableString、およびNSMutableArrayです。

それを試してみて、参照してください。コンパイルに失敗した場合は、いいえ。成功すれば、はい。

  • または私は、例えば、フレームワークの包含を制御するために、ヘッダファイル内のプリプロセッサディレクティブを使用することができ

はい、可能です。実際には、私はそれがの方法だと思います。

+0

ありがとうございます。それについて考えると、Foundationはフレームワークなので、問題はないはずです。私はそれを行って見てみましょう! – BWHazel

+0

それを考えると、コアプロットはあなたがしたいことをまったく行います。問題がある場合は、それをチェックして、彼らが何をしているかを見てください。 – CajunLuke

8

それは魔法のように動作:

#ifdef __APPLE__ 
    #include "TargetConditionals.h" 

    #if TARGET_IPHONE_SIMULATOR 
    // ios simulator 

    #elif TARGET_OS_IPHONE 
    // ios device 

    #elif TARGET_OS_MAC 
    // mac os 

    #else 
    // Unsupported platform 
    #endif 
#endif 
+0

私はこれがここで実際に動作する唯一の答えだと思います。 –

1

これは私のために完璧に動作します:

#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED 
//iOS 
#else 
//Mac 
#endif 
関連する問題