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