iOS不同版本号适配问题(#ifdef __IPHONE_7_0)
部分參考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)的更多相关文章
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)
继续说说ios不同版本之间的适配 先说一个东西:在xcode当中有一个东西叫targets,苹果的官方文档是这样说的: A target specifies a product to build an ...
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)(转载)
继续说说ios不同版本之间的适配 先说一个东西:在xcode当中有一个东西叫targets,苹果的官方文档是这样说的: A target specifies a product to build an ...
- 关于IOS的屏幕适配(iPhone)——资源适配
IOS的屏幕适配几乎不需要大量的代码操作,更多的时间我们只是动动鼠标选择一下就搞定.可以苹果在这方面做的还是比较人性的,解放了开发者. 首先来说说Iphone这几种屏(由于最近做的是iPhone AP ...
- iOS 6 & iOS 7 的适配笔记
iOS 6 & iOS 7 的适配 场景1: 没有NavigationController,同时根视图是UIView- (void)viewWillLayoutSubviews{ if ([[ ...
- 选择性编译代码:如 #ifdef __IPHONE_7_0
选择性编译代码: 选择性编译代码和选择性运行代码是不一样的,区别在于: 1.选择性编译代码是在硬件或者系统不支持的情况下不会对该段代码进行编译,也就不会由于不兼容的问题导致报错 #import < ...
- 【转】iOS学习之适配iOS10
适配iOS10 2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从N ...
- iOS 9之适配ATS(转载)
iOS 9系统已经出来了,而网络方面的ATS(App Transport Security)特性可以说每个人都要经历.而我这篇博客,就是结合我最近几天的经历,来谈谈从服务器到iOS客户端对ATS的适配 ...
- iOS 10 版本适配问题收集-b
随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...
- iOS 10 的适配问题
随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...
随机推荐
- 图的最短路径Dijkstra
#include <stdio.h> #include <string.h> #include <vector> #include <queue> #i ...
- BZOJ 3831 单调队列DP
思路: 这好像是我刚学单调性的时候做的题 (我是不会告诉你 我被这题教做人了的...) i-stk[head]>k 删队头 f[stk[tail]]>f[i]||(f[stk[tail]] ...
- POJ 3264 线段树 ST
题意:给你一个数列,从中挑一段,问你这段数的最大值减最小值是多少. 思路:线段树. // by Sirius_Ren #include <cstdio> #include <algo ...
- springboot 的一般配置
import javax.servlet.Filter; import org.springframework.boot.SpringApplication; import org.springfra ...
- SQlserver 当输入参数为可选条件
以前很懒,都是用拼接字符串的方式,加上if 语句,根据输入参数是否为空来判断是否需要在where 后加上对应字段的条件限制 但是拼接字符串很烦,又总是被转义符搞得很烦 '''' 所以想了其他办法 分 ...
- VHDL之std_logic_1164
This packages defines a standard for designers to use in describing the interconnection data types u ...
- WinXP SSH连接不上虚拟机的解决方法
问题现象描述: 在VMWare中安装好linux系统后,选择桥接,从宿主机Windows上使用Putty, SSH Secure Shell等客户端工具连接linux上的ssh服务,客户端一直没有反应 ...
- 深圳面试一周记录——.NET(B/S)开发
个人简单信息:2011年毕业,最高学历大专,最近一份工作在广州:有做架构设计经验,有一年的带团队(10人左右)经验:互联网和行业软件公司都待过. 为免不必要的争论,本文说地址的就不说公司行业,说公司行 ...
- How to use pthread_create && mutex?
1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread. ...
- Java实验环境搭建
1.JDK的下载一.JDK的下载及安装 (1).网站网址搜索http://www.oracle.com/technetwork/java,进入浏览页(2)找到Trials and Download 点 ...