iOS学习 --- __IPHONE_OS_VERSION_MAX_ALLOWED的使用

iOS学习 --- __IPHONE_OS_VERSION_MAX_ALLOWED的使用
__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
www.zeeklog.com  - iOS学习 --- __IPHONE_OS_VERSION_MAX_ALLOWED的使用
#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 {
    // 使用旧的方案...
}