qi前言:写一个宏来选择性地编译与运行为不同iOS所写的代码来支持多个版本的ios工程
#if __IPHONE_OS_VERSION_MIN_REQUIRED #import "xxxxxxxx ios7以下版本" #else #import "xxxxxxxx 比如ios7以上版本" #endif
官网文档介绍:
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED /* make sure a default max version is set */ #ifndef __IPHONE_OS_VERSION_MAX_ALLOWED #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_7_0 #endif /...........................
#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) #具体内容 #endif
如果我们打算加入一些高于某个特定版本的OS版本上的东西,我们不需要前面提到的条件编译(因为在后面版本的编译时我们需要这些代码)。在这个情况下,只有runtime检查是需要的。你既可以直接做该检查,也可以与其他宏保持整齐如下所示:
#define IF_PRE_IOS4(...) if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_4_0) { __VA_ARGS__ }
这里有三点需要指出:
- 我使用
kCFCoreFoundationVersionNumber在runtime时决定iPhone OS的版本。网上也有许多其他的例子比如使用
[[UIDevice currentDevice] systemVersion],但是这个方法需要进行字符串的比较而且可能需要处理字符串中的最大和最小数字。相比而言,一个double型的比较更加直接。
- 我没有使用惯用的do{x}while(0)结构在这个宏中,因此如果你需要的话你可以添加一个else在该宏的末尾(而且它不需要条件编译)。
- 我为这个宏设计了可变的参量列表,因此你可以添加任意数量的参量而不会有问题。