部分參考http://www.cnblogs.com/ios8/p/ios-version-com.html
以下举个简单的样例来说明在iOS7.0和iOS6.1(以及更低版本号)之间的适配问题(用的是xcode5.0。里边有6.1和7.0两个版本号的sdk)
新建一个project。默认的development target。base sdk以及模拟器的版本号都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下
self.window.tintColor = [UIColor redColor];
然后执行,这样是没有不论什么错误的。接下来将development target。base sdk以及模拟器的版本号都改成6.1(注意默认的xcode是没有6.1的sdk的,须要自己另外导入)。
然后执行。就会报错:
也就是说tintColor属性在iOS6.1中根本就没有。在编译时候就会出错。这时候例如以下加上推断语句也是没实用的,照样报错(预处理。编译,执行的问题这里不再废话)
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; }遇见这样的情况仅仅能加上预处理语句,这样写:
<del>#ifdef __IPHONE_7_0 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; } #endif</del>
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; } #endif
当中__IPHONE_OS_VERSION_MAX_ALLOWED定义在usr/include/AvailabilityInternal.h中 #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED /* make sure a default max version is set */ #ifndef __IPHONE_OS_VERSION_MAX_ALLOWED #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_7_0 #endif /* make sure a valid min is set */ #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_2_0 #undef __IPHONE_OS_VERSION_MIN_REQUIRED #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_2_0 #endif 。。。。 #endif 注意须要增加头文件#import </usr/include/Availability.h> 这样编译通过就不会报错了……这是由于在sdk6.1下的usr/include下边有一个Availability.h文件,里边定义了一大堆宏,当中关于iphone的有 #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_NA 99999 /* not available */
而sdk7.0里边多了一行
#define __IPHONE_7_0 70000iOS8当然也是一样的道理
除此之外。当使用framework或者.a的时候须要注意
由于在编译framework或者.a的时候是依赖当时编译的环境决定的,如使用iOS6的sdk能够将framework或者.a顺利编译通过。可是在真正生成app的时候须要保证编译app时的sdk和编译framework或者.a的sdk是一致的,且同一时候须要增加执行时推断([[[UIDevice currentDevice] systemVersion] floatValue]那个)
说明:
1、假设是使用低版本号sdk编译的(如iOS6),将终于的应用安装至高版本号的设备上(iOS7的系统),此时应该不会出现故障,由于iOS7兼容iOS6,可是无法使用iOS7特有的新功能,由于代码被屏蔽了。
2、假设是使用高版本号sdk编译的(如iOS7),将终于的应用安装至低版本号的设备上(iOS6的系统),此时假设不增加执行时推断就会出现故障(可能是crash)。由于应用本身是用iOS7编译的,并使用iOS7才有的新功能,而设备并不支持iOS7。
写的可能有点乱了,纯自己记录用的