__IPHONE_OS_VERSION_MAX_ALLOWED:值等于Base SDK,当前开发环境版本(当前开发环境的系统SDK版本),如Xcode9.4.1中SDK版本是是iOS11.4。
__IPHONE_OS_VERSION_MIN_REQUIRED: 值等于Deployment Target,检查支持的最小系统版本。
NS_AVAILABLE_IOS(6_0):自iOS6.0开始支持该方法,若在iOS6.0之前的版本使用该方法,则会导致 Crash;
NS_DEPRECATED_IOS(2_0, 3_0):表示该方法只能在IOS2.0 和 IOS3.0之间使用,是已被废弃的方法,但并不是说在IOS3.0之后不能使用该方法,是可以使用,但也需要考虑找其他替代方法了。
NS_AVAILABLE(10_8, 6_0):表示该方法分别随Mac OS 10.8和iOS 6.0被引入。
NS_DEPRECATED(10_0, 10_6, 2_0, 4_0):表示该方法随Mac OS 10.0和iOS 2.0被引入,在Mac OS 10.6和iOS 4.0后被废弃。
注意:
Base SDK
用来编译APP的SDK(Software Development Kit)的版本,一般保持当前XCode支持的最新的就好。
SDK其实就是包含了所有的你要用到的头文件、链接库的集合,你的APP里面用的各种类、函数,能编译、链接成最后的安装包,就要靠它,苹果每次升级系统,新推出的各种API,也是在SDK里面。所以一般Base SDK肯定是大于等于Deployment Target的版本。
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
// 当前开发环境版本在iOS10.0及以上则编译此部分代码
#else
// 如果低于iOS10.0则编译此部分代码
#endif

#define __IPHONE_2_0 20000
#define __IPHONE_2_1 20100
#define __IPHONE_2_2 20200
#define __IPHONE_3_0 30000
#define __IPHONE_3_1 30100
#define __IPHONE_3_2 30200
#define __IPHONE_4_0 40000
#define __IPHONE_4_1 40100
#define __IPHONE_4_2 40200
#define __IPHONE_4_3 40300
#define __IPHONE_5_0 50000
#define __IPHONE_5_1 50100
#define __IPHONE_6_0 60000
#define __IPHONE_6_1 60100
#define __IPHONE_7_0 70000
#define __IPHONE_7_1 70100
#define __IPHONE_8_0 80000
#define __IPHONE_8_1 80100
#define __IPHONE_8_2 80200
#define __IPHONE_8_3 80300
#define __IPHONE_8_4 80400
#define __IPHONE_9_0 90000
#define __IPHONE_9_1 90100
#define __IPHONE_9_2 90200
#define __IPHONE_9_3 90300
#define __IPHONE_10_0 100000
#define __IPHONE_10_1 100100
#define __IPHONE_10_2 100200
#define __IPHONE_10_3 100300
#define __IPHONE_11_0 110000
#define __IPHONE_11_1 110100
#define __IPHONE_11_2 110200
#define __IPHONE_11_3 110300
#define __IPHONE_11_4 110400
使用案例
实现使用 ios8新的 UIAlertCtrller 的代码如下:
方法1
方法2// 编译时判断:检查SDK版本 #if __IPHONE_OS_VERSION_MAX_ALLOWED > 80000 // 运行时判断:检查当前系统版本 if ([UIDevice currentDevice].systemVersion.floatValue > 8.0f) { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"标题" message:@"内容" preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { NSLog(@"Cancel"); }]]; [self presentViewController:alertController animated:YES completion:nil]; } else { // 用旧的代替 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"标题" message:@"内容" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil]; [alertView show]; } #else // ... #endif
方法3#if __IPHONE_OS_VERSION_MAX_ALLOWED > 80000 // Weakly Linked判断 if ([UIAlertController class]) { // 使用UIAlertController... } else { // 使用旧的方案... } #endif
Class class = NSClassFromString (@"UIAlertController"); if (class) { // 使用UIAlertController... } else { // 使用旧的方案... }