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

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

iOS不同版本号适配问题(#ifdef __IPHONE_7_0)的更多相关文章

  1. IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)

    继续说说ios不同版本之间的适配 先说一个东西:在xcode当中有一个东西叫targets,苹果的官方文档是这样说的: A target specifies a product to build an ...

  2. IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)(转载)

    继续说说ios不同版本之间的适配 先说一个东西:在xcode当中有一个东西叫targets,苹果的官方文档是这样说的: A target specifies a product to build an ...

  3. 关于IOS的屏幕适配(iPhone)——资源适配

    IOS的屏幕适配几乎不需要大量的代码操作,更多的时间我们只是动动鼠标选择一下就搞定.可以苹果在这方面做的还是比较人性的,解放了开发者. 首先来说说Iphone这几种屏(由于最近做的是iPhone AP ...

  4. iOS 6 & iOS 7 的适配笔记

    iOS 6 & iOS 7 的适配 场景1: 没有NavigationController,同时根视图是UIView- (void)viewWillLayoutSubviews{ if ([[ ...

  5. 选择性编译代码:如 #ifdef __IPHONE_7_0

    选择性编译代码: 选择性编译代码和选择性运行代码是不一样的,区别在于: 1.选择性编译代码是在硬件或者系统不支持的情况下不会对该段代码进行编译,也就不会由于不兼容的问题导致报错 #import < ...

  6. 【转】iOS学习之适配iOS10

    适配iOS10 2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从N ...

  7. iOS 9之适配ATS(转载)

    iOS 9系统已经出来了,而网络方面的ATS(App Transport Security)特性可以说每个人都要经历.而我这篇博客,就是结合我最近几天的经历,来谈谈从服务器到iOS客户端对ATS的适配 ...

  8. iOS 10 版本适配问题收集-b

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...

  9. iOS 10 的适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...

随机推荐

  1. 【Codeforces】Codeforces Round #374 (Div. 2) -- C. Journey (DP)

    C. Journey time limit per test3 seconds memory limit per test256 megabytes inputstandard input outpu ...

  2. Oracle 数据导入导出(imp/exp)

    环境:windows下,oracle11g 1.启动oracle服务 net start OracleDBConsoleorclnet start OracleOraDb11g_home1TNSLis ...

  3. jquery中的left和top

    left 和 top /*1. 获取元素基于定位容器的位置*/ /*返回的是对象 属性 left top */ var position = $('.inner').position(); conso ...

  4. Android开发笔记(12)——ListView & Adapter

    转载请注明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是关于ListFragment的内容,首先先介绍ListView的相关配置,理解ListF ...

  5. 新书《计算机图形学基础(OpenGL版)》PPT已发布

    为方便有些老师提前备课,1-10章所有章节已发布到本博客中. 欢迎大家下载使用,也欢迎大家给我们的新书反馈与意见,谢谢!

  6. Arduino控制DTH11模块

    一.接线原理图 二.实物图 三.事例代码 下载 git clone https://github.com/adafruit/DHT-sensor-library.git 放到 arduino-1.6. ...

  7. [iOS Reverse]logify日志追踪,锁定注入口-控制台查看

    前言 logify是theos的一个组件,路径是: /opt/theos/bin/logify.pl 我们还是以微信红包为例子,根据[iOS Hacking]运行时分析cycript得到的入口文件: ...

  8. cocos ios Label组件问题

    软件:cocos creator v1.9.0 开发的过程中,一直在web上预览,Label组件显示一直没问题.在打包到ios上时,出现问题了: Label组件: 当我们缩小字体,发现没问题了,当我们 ...

  9. PAT_A1150#Travelling Salesman Problem

    Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...

  10. HDU 1241 Oil Deposits (DFS or BFS)

    链接 : Here! 思路 : 搜索判断连通块个数, 所以 $DFS$ 或则 $BFS$ 都行喽...., 首先记录一下整个地图中所有$Oil$的个数, 然后遍历整个地图, 从油田开始搜索它所能连通多 ...