是否有任何预处理器宏仅在 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/