部分參考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 70000

iOS8当然也是一样的道理

除此之外。当使用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。

写的可能有点乱了,纯自己记录用的

最新文章

  1. urllib库初体验以及中文编码问题的探讨
  2. 查询Sqlserver数据库死锁的一个存储过程(转)
  3. [转]在iOS项目中使用CorePlot框架
  4. 酷狗音乐盒缓存文件夹KuGouCache的设置方法
  5. linux下恢复误删除的文件方法(ext2及ext3)
  6. idea 14 svn安装
  7. UVALive 5713 Qin Shi Huang&#39;s National Road System(次小生成树)
  8. [HIve - LanguageManual] Join Optimization (不懂)
  9. 【高级JEE技术】JMX
  10. js 模板引擎 jade使用语法
  11. BZOJ_3038_上帝造题的七分钟2_线段树
  12. MockPlus原型设计介绍
  13. android菜鸟,了解android工程目录结构
  14. LeetCode练习2 两数相加
  15. (Android第一行代码实验一)活动的最佳实践
  16. Log4j详细介绍(五)----输出地Appender
  17. 18.os模块获取url后缀
  18. linux移植常见问题
  19. JAVA排序总结
  20. 64. [Mcoi2018]终末之诗(上)

热门文章

  1. hdu5249
  2. [BZOJ1601] 灌水
  3. Python生成器(yield)
  4. Spring Boot (11) mybatis 关联映射
  5. 6月7号shiro
  6. 自己整理的HTML基本标签参考知识
  7. Android 4.0 Launcher2源码分析——主布局文件(转)
  8. 九九乘法表---for循环的嵌套
  9. hibernate中的懒加载和急加载
  10. 作业07之《MVC模式》