Xcode预处理器宏来检查Base SDK> = iOS 7.0

que*_*dam 32 xcode ios ios7

是否只有在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编译时添加一些我想要的代码,但是如果base SDK是iOS 6.1则不能编译.

例:

if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [_tableView setSeparatorInset:UIEdgeInsetsZero];
}
Run Code Online (Sandbox Code Playgroud)

上面这段代码不能用iOS 6.1 base SDK编译,因为它抱怨没有为UITableView定义setSeparatorInset.因此,我想在预处理器指令中包含这段代码,有条件地在基本SDK上.

Ali*_*are 43

您应该阅读Apple的SDK兼容性指南,其中解释了所有这些技术.

特别是,他们建议使用__IPHONE_OS_VERSION_MIN_REQUIRED宏来测试项目的部署目标(最低支持版本),对于您的情况,使用__IPHONE_OS_VERSION_MAX_ALLOWED宏来测试用于编译的Base 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
Run Code Online (Sandbox Code Playgroud)

重要说明:您应该在比较中使用数字常量,就好像您测试一样#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0,例如它在使用SDK 6时不起作用,因为__IPHONE_7_0未定义,因此在该上下文中评估为0,并且您的条件将无法按预期工作.

  • 你在Xcode5中安装了SDK6 ?! (可能是通过将Xcode.app包中的目录从你原来的Xcode4复制到你认为新的Xcode5?)这可能是这种奇怪行为的根源.我建议您保留一个Xcode4.app,如果您需要使用SDK6构建,并且需要使用SDK7编译时使用Xcode5.app(并删除您在Xcode5中复制的SDK6).这就是我的工作(我的开发Mac上有Xcode4.app和Xcode5.app),而不是`__IPHONE_OS_VERSION_MAX_ALLOWED`. (2认同)

rck*_*nes 20

是的你可以使用__IPHONE_7_0define:

#ifdef __IPHONE_7_0
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [_tableView setSeparatorInset:UIEdgeInsetsZero];
    }
#endif
Run Code Online (Sandbox Code Playgroud)

  • 事实并非如此.如果我将基本SDK设置为iOS 7,那么这段代码就不会被编译(为了编译它,我还需要将开发目标设置为iOS 7,这不是我想要的).我正在寻找一个预处理器条件,如果基本SDK是iOS 7或更高版本,它会编译代码,无论开发目标的价值如何(实际上我想保留在iOS 6) (2认同)

Moj*_*aba 13

根据Apple Doc,您应该使用它NSFoundationVersionNumber来区分iOS 7和其他.您可以使用以下宏来简化:

#define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 
#define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1
Run Code Online (Sandbox Code Playgroud)

然后在代码中做

#ifdef __IPHONE_7_0
    if (isIOS7) {
       // Do additional stuff for iOS 7.
    } 
#endif
Run Code Online (Sandbox Code Playgroud)

是的,您应该检查编译时(使用#ifdef)和运行时(使用isIOS7),这样您就可以使用iOS6 SDK,iOS7 SDK和iOS7 SDK以及iOS6目标进行编译.

哦!请记住,你不能if (!isIOS7)使用if (isIOS6).

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