天天看點

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           
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 {
    // 使用舊的方案...
}