首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode预处理器宏以检查基础SDK >= iOS 7.0

Xcode预处理器宏以检查基础SDK >= iOS 7.0
EN

Stack Overflow用户
提问于 2013-11-05 21:20:18
回答 5查看 46.4K关注 0票数 32

是否有预处理器宏,仅当Base SDK为7.0或更高版本时才编译某些部分代码?“SDK”定义的常量似乎链接到iOS开发目标(而不是基础__IPHONE_7_0)。

我使用的是安装了iOS 7和iOS 6.1的XCode 5。

我问这个问题的原因是,我目前正在将一个应用程序从iOS 6过渡到iOS 7。有相当多的事情需要调整,目前我仍然希望使用iOS 6.1作为基础SDK (以及开发目标iOS 6.0)编译我的应用程序,但我已经想添加一些代码,这些代码在我使用iOS 7sdk编译时都会需要,但是如果基础SDK是iOS 6.1,这些代码就不会编译。

示例:

代码语言:javascript
复制
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [_tableView setSeparatorInset:UIEdgeInsetsZero];
}

上面这段代码不能使用iOS 6.1基础软件开发工具包编译,因为它抱怨setSeparatorInset没有为UITableView定义。因此,我希望将这段代码包含在预处理器指令中,有条件地包含在基础SDK中。

EN

回答 5

Stack Overflow用户

发布于 2013-11-05 21:29:56

你应该读一读苹果的SDK Compatibility Guide,里面解释了所有这些技术。

特别是,他们建议使用__IPHONE_OS_VERSION_MIN_REQUIRED宏对项目的部署目标(最低支持版本)进行测试,对于您的情况,建议使用 SDK 宏来测试用于编译的基础SDK。

示例:

代码语言:javascript
复制
#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时,例如它在使用SDK6时不会工作一样,因为__IPHONE_7_0没有定义,因此在该上下文中计算为0,并且您的条件不会像预期的那样工作。

票数 44
EN

Stack Overflow用户

发布于 2013-11-05 21:24:55

是的,您可以使用__IPHONE_7_0定义:

代码语言:javascript
复制
#ifdef __IPHONE_7_0
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [_tableView setSeparatorInset:UIEdgeInsetsZero];
    }
#endif
票数 20
EN

Stack Overflow用户

发布于 2013-11-27 07:37:07

根据苹果文档,你应该使用NSFoundationVersionNumber来区分iOS 7和其他操作系统。您可以使用以下宏使其更简单:

代码语言:javascript
复制
#define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 
#define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1

然后在稍后的代码中执行

代码语言:javascript
复制
#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/

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19789958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档