ベース SDK >= iOS 7.0 かどうかを確認する Xcode プリプロセッサ マクロ 質問する

ベース SDK >= iOS 7.0 かどうかを確認する Xcode プリプロセッサ マクロ 質問する

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

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

私がこれを質問する理由は、現在アプリを iOS 6 から iOS 7 に移行しているからです。調整すべき点がかなりあり、現在のところ iOS 6.1 をベース SDK として (開発ターゲット iOS 6.0 として) アプリをコンパイルしたいと考えていますが、iOS 7 SDK でコンパイルするときに必要になるコードをいくつか追加したいと思っています。ただし、ベース SDK が iOS 6.1 の場合はコンパイルされません。

例:

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

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

ベストアンサー1

AppleのSDK 互換性ガイドこれらすべてのテクニックが説明されています。

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


例:

#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_0SDK 6 を使用する場合は、が__IPHONE_7_0定義されていないためそのコンテキストでは 0 と評価され、条件が期待どおりに機能しないため、テストは機能しません。

おすすめ記事