有时候在项目中为了兼容低版本IOS系统,通常会针对不同的OS版本写不同的代码,例如:

#define IS_IOS7_OR_LATER            ([[UIDevice currentDevice].systemVersion floatValue] >=7.0)

if(IS_IOS7_OR_LATER)
{
[[UINavigationBar appearance] setBarTintColor:[UIColor standardLightGray]]; //IOS7时才有的API
}
else
{
[[UINavigationBar appearance] setTintColor:[UIColor standardLightGray]];
}

这段代码在xcode5/xcode6上编译是没有问题的,但是在xcode4.6上编译通过不了,因为这个if/else要在运行时才能知道判断条件是否成立,在代码编译时是不知道的。可以这样处理:

#define IS_IOS7_OR_LATER            ([[UIDevice currentDevice].systemVersion floatValue] >=7.0)

#ifdef __IPHONE_7_0
if(IS_IOS7_OR_LATER)
{
[[UINavigationBar appearance] setBarTintColor:[UIColor standardLightGray]];
}
else
{
[[UINavigationBar appearance] setTintColor:[UIColor standardLightGray]];
}
#else
[[UINavigationBar appearance] setTintColor:[UIColor standardLightGray]];
#endif
__IPHONE_7_0是系统的宏,在编译时可以确定它有没有定义。这样的话代码在xcode4.6/xcode5/xcode6上均可编译成功。
但是如果在xcode4.6(IOS6)上编译,编译时xcode会把#ifdef~#else之间的代码删除掉,只会编译#else~#endif之间的代码,最终你项目中针对高版本IOS的代码不会被执行,即使你是在IOS8的手机上运行该程序。
所以如果你想同时兼容高版本和低版本的IOS,就要使用高版本的xcode来编译代码,同时如果你希望项目在低版本的xcode上编译运行,请在代码中使用上面的宏来区分IOS版本。

xcode针对不同IOS版本的代码编译问题的更多相关文章

  1. 不同iOS版本做代码适配__IPHONE_OS_VERSION_MAX_ALLOWED 和 __IPHONE_8_0等专业术语

    目前开发只想最低版本支持iOS8了,iOS8以前的就不管了,然后现在iOS9和iOS10出来以后,有些新的API,也有些弃用的API,为了兼容,有时候代码里面需要编写判断不同iOS版本,或者只允许指定 ...

  2. XCODE 添加不同IOS版本的模拟器

    一.XCode->Preferences->Downloads, 可以下载模拟器.

  3. 关于服务器jdk版本和代码编译调试兼容问题

    首先代码是基于哪个版本编写和调试,有没有用到新版本jdk新的特性,类啊接口啊啥的,用到了的话,就不行了 其他都共有的是向下兼容的 最好开发环境的jdk版本和部署环境的jdk版本匹配.

  4. 如何把iOS代码编译为Android应用

    新闻 <iPhone 6/6 Plus中国销量曝光:单月销量650万>:据iSuppli Corp.中国研究总监王阳爆料,iPhone 6和iPhone 6 Plus在国内受欢迎的情况大大 ...

  5. wzplayer for ios 针对(mms)优化版本V1.0

    wzplayer for ios针对mms优化版本发布. 1.支持mms,http,rtmp,rtsp等协议 2.支持全格式 下载地址:http://www.coolradio.cn/WzPlayer ...

  6. 黑科技抢先尝 - Windows全新终端初体验(附无需编译就能安装的Preview版本及代码Build全过程)

    目录 将Window 10 升级到1903版本 安装好git, 从github上clone代码 安装 VS 2019 和 .NET core 3.0 SDK 重定解决方案目标 设置好编译平台和启动的项 ...

  7. iOS版本、iPhone版本、Xcode版本比对

    iOS版本 iPhone版本 Xcode版本 其他 2003年 Xcode1.0 2005年4月29日 Xcode2.0 2007年1月9日 iPhone OS(iOS1): 虚拟键盘.谷歌地图 第一 ...

  8. 如何提升代码编译的速度 iOS

    前阵子有遇到代码编译速度慢的问题,特别是在swift和object-c混编的过程中问题很突显. 网上找到一篇蛮好的文章里面又一些解决方法 推荐一下 http://www.open-open.com/l ...

  9. iOS中的预编译指令的初步探究

    目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...

随机推荐

  1. java Class的Long id初始化 为0的问题android数据库操做出现的 android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

    java的class中的Long类型变量调用默认的 构造函数new后会被初始化为0. 这句话大家可能感觉这么低级的事情还用你说? 我想说的是这个会产生的一个应用场景 和 避免方法 场景:db插入时候p ...

  2. android gridview按钮边框和定制点击颜色

    <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="ht ...

  3. SQL Server 索引结构及其使用(一)

    转载:SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clus ...

  4. 在8086中,[ idata],[bx]表示内存单元时。可能是一个字节,也可能是一个字。

    可能表示一个字节,也可能表示一个字.主要由指令中另一个计算对象决定.如al表示一个字节.ax就表示一个字. 这个区别主要体现在循环中,偏移地址的循环变量是加1还是加2,al是偏移地址加1,ax是偏移地 ...

  5. 156. Binary Tree Upside Down

    题目: Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node ...

  6. 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误

    1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...

  7. hadoop2.2编程:用ruby跑hadoop的完整实例

    Becareful!  All nodes include  need to install ruby! #!/usr/bin/ruby # Ruby code for map.rb ARGF.eac ...

  8. [LeetCode#272] Closest Binary Search Tree Value II

    Problem: Given a non-empty binary search tree and a target value, find k values in the BST that are ...

  9. 存储过程中“Select Top 变量”的问题如何解决

    在SqlServer2005中,可以这样: DECLARE @p int SELECT TOP (@p) * FROM 表名 在SqlServer2000中,不支持以上方法,可以这样: DECLARE ...

  10. POJ 1860 Currency Exchange + 2240 Arbitrage + 3259 Wormholes 解题报告

    三道题都是考察最短路算法的判环.其中1860和2240判断正环,3259判断负环. 难度都不大,可以使用Bellman-ford算法,或者SPFA算法.也有用弗洛伊德算法的,笔者还不会SF-_-…… ...