ios - Xcode 预处理器宏检查 Base SDK 是否 >= iOS 7.0

标签 ios xcode 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 编译时我都需要这些代码,但如果基础 SDK 是 iOS 6.1,则不会编译。

例子:

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

上面这段代码不能用 iOS 6.1 基础 SDK 编译,因为它提示没有为 UITableView 定义 setSeparatorInset。因此,我想将这段代码包含在预处理器指令中,有条件地基于基础 SDK。

最佳答案

您应该阅读 Apple 的 SDK Compatibility Guide其中解释了所有这些技术。

特别是,他们建议使用 __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

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

关于ios - Xcode 预处理器宏检查 Base SDK 是否 >= iOS 7.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19789958/

相关文章:

ios - 如何删除iOS通知服务扩展中的文件?

objective-c - 删除 UITableView 中的行时出错

ios - 为什么我的 detailTextLabel 会移动?

iphone - Xcode 5命令行:体系结构“arm64”的无效部署目标“3.0.0”

ios - Xcode:存档在验证期间有不正确的包 ID 和配置文件

ios - XCode: "<foo> (from ' 的私钥 <bar >')"未安装在此 Mac 上

ios - 尝试以编程方式从一个 XIB 文件创建多个 View

ios - 如何在 iOS7 中以编程方式找到连接 3G 网络或 Wifi 的 iPhone 设备

ios - 生成具有相同属性的多个 Sprite 节点

css - 在 Jquery Mobile 中,如何在 iPad 的手机间隙应用程序中禁用放大镜?