zoukankan      html  css  js  c++  java
  • 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。


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




  • 相关阅读:
    bzoj1934 Vote 善意的投票 最小割(最大匹配)
    poj3417 Network 树上差分+LCA
    bzoj1076 奖励关 期望dp
    bzoj1087 互不侵犯King 状压dp+bitset
    bzoj1041 圆上的整点 数学
    bzoj 1085骑士精神 迭代深搜
    CodeForces 1043D Mysterious Crime 区间合并
    2018.12.14 浪在ACM 集训队第九次测试赛
    2018.12.9 中国石油大学第四次新生训练赛题解
    2018.12.8 中国石油大学第三次新生训练赛题解
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6921222.html
Copyright © 2011-2022 走看看