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