__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
// 编译时判断:检查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
方法2
#if __IPHONE_OS_VERSION_MAX_ALLOWED > 80000
// Weakly Linked判断
if ([UIAlertController class]) {
// 使用UIAlertController...
} else {
// 使用旧的方案...
}
#endif
方法3
Class class = NSClassFromString (@"UIAlertController");
if (class) {
// 使用UIAlertController...
} else {
// 使用旧的方案...
}