web-dev-qa-db-ja.com

Base SDK> = iOS 7.0かどうかを確認するXcodeプリプロセッサマクロ

Base 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のプリプロセッサディレクティブに含めたいと思います。

32
quentinadam

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

#ifdef __IPHONE_7_0
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [_tableView setSeparatorInset:UIEdgeInsetsZero];
    }
#endif
20
rckoenes

また、このマクロを使用できます

_#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)
_

例:if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.1")) {[self doSomething];} else {[self doSomethingElse];}

3
Akki

SDKをテストするのではなく、メソッド/クラスIMHOの可用性をテストする必要があります。プリコンパイル済みではない

2
Daij-Djan