[英]Xcode preprocessor macro to check if Base SDK >= iOS 7.0
是否只有在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 base SDK编译,因为它抱怨没有为UITableView定义setSeparatorInset。 因此,我想在预处理器指令中包含这段代码,有条件地在基本SDK上。
您应该阅读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并且您的条件不会按预期工作。
是的你可以使用__IPHONE_7_0
定义:
#ifdef __IPHONE_7_0
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[_tableView setSeparatorInset:UIEdgeInsetsZero];
}
#endif
根据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
是的,您应该检查编译时(使用#ifdef
)和运行时(使用isIOS7
),这样您就可以使用iOS6 SDK,iOS7 SDK和iOS7 SDK以及iOS6目标进行编译。
哦! 请记住, if (!isIOS7)
你不得不使用if (isIOS6)
。
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/
此外,您可以使用此宏
#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];}
您不应该测试sdk,而是测试方法/类IMHO的可用性。 所以根本没有预编译
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.