32

Base SDK が 7.0 以降の場合にのみ、コードの特定の部分をコンパイルするプリプロセッサ マクロはありますか? 「__IPHONE_7_0」で定義された定数は、iOS 開発ターゲットにリンクされているようです (ベース SDK にはリンクされていません)。

iOS 7 と iOS 6.1 がインストールされた XCode 5 を使用しています。

私がこれを尋ねている理由は、私が現在 iOS 6 から iOS 7 にアプリを移行しているためです。調整することがかなりありますが、現在も基本 SDK として iOS 6.1 を使用してアプリをコンパイルしたいと考えています (および開発ターゲット iOS 6.0 を使用) ですが、iOS 7 SDK でコンパイルするたびに必要になるコードを既に追加したいと考えていますが、ベース SDK が iOS 6.1 の場合はコンパイルされません。

例:

if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [_tableView setSeparatorInset:UIEdgeInsetsZero];
}

上記のコードは、setSeparatorInset が UITableView に対して定義されていないことを訴えているため、iOS 6.1 ベース SDK ではコンパイルされません。したがって、このコードをプリプロセッサ ディレクティブ内に、条件付きでベース SDK に含めたいと思います。

4

5 に答える 5

44

これらすべてのテクニックが説明されているApple のSDK Compatibility Guideを読む必要があります。

特に、マクロを使用してプロジェクトの展開ターゲット(サポートされている最小バージョン)__IPHONE_OS_VERSION_MIN_REQUIREDに対してテストすることをお勧めします。また、マクロを使用して、コンパイルに使用されるベース SDK をテストすることをお勧めします。__IPHONE_OS_VERSION_MAX_ALLOWED


例:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
// Only COMPILE this if compiled against BaseSDK iOS7.0 or greater
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
   // Even when compiled with BaseSDK 7, only EXECUTE that if the user uses an
   // OS that support this method (namely if the user is running iOS7 or later,
   // but not for users running iOS6).
   [_tableView setSeparatorInset:UIEdgeInsetsZero];
}
#endif

重要な注意:#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0たとえば、SDK 6 を使用する場合は機能しないため、比較で数値定数を使用する必要__IPHONE_7_0があります。定義されていないため、そのコンテキストでは 0 に評価され、条件が期待どおりに機能しません。

于 2013-11-05T13:29:56.410 に答える
20

はい、定義を使用でき__IPHONE_7_0ます:

#ifdef __IPHONE_7_0
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [_tableView setSeparatorInset:UIEdgeInsetsZero];
    }
#endif
于 2013-11-05T13:24:54.953 に答える
13

Apple Doc に従ってNSFoundationVersionNumber、iOS 7 とその他を区別するために使用する必要があります。次のマクロを使用して、より簡単にすることができます。

#define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 
#define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1

そして、後でコードで行う

#ifdef __IPHONE_7_0
    if (isIOS7) {
       // Do additional stuff for iOS 7.
    } 
#endif

はい、コンパイル時 ( を使用#ifdef) と実行時 ( を使用) の両方をチェックしisIOS7て、iOS6 SDK 、iOS7 SDK、および iOS6 ターゲットの iOS7 SDK でコンパイルできるようにする必要があります。

おー!if (!isIOS7)を使用する必要はありませんif (isIOS6)

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/

于 2013-11-26T23:37:06.827 に答える