32

仅当 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 编译,因为它抱怨 setSeparatorInset 没有为 UITableView 定义。因此,我想将这段代码包含在预处理器指令中,有条件地基于基础 SDK。

4

5 回答 5

44

您应该阅读 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

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

于 2013-11-05T13:29:56.410 回答
20

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

#ifdef __IPHONE_7_0
    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [_tableView setSeparatorInset:UIEdgeInsetsZero];
    }
#endif
于 2013-11-05T13:24:54.953 回答
13

根据 Apple Doc,您应该使用NSFoundationVersionNumber它来区分 iOS 7 和其他系统。您可以使用以下宏使其更简单:

#define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1 
#define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1

然后在代码中做

#ifdef __IPHONE_7_0
    if (isIOS7) {
       // Do additional stuff for iOS 7.
    } 
#endif

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

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

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

于 2013-11-26T23:37:06.827 回答
3

此外,您可以使用此宏

#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];}

于 2013-11-05T13:39:48.623 回答
1

您不应该测试 sdk,而是测试方法/类恕我直言的可用性。所以根本没有预编译

于 2013-11-05T13:33:59.300 回答