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)

新建一个工程,默认的development target,base sdk以及模拟器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下

[objc]  view plain  copy
  1. self.window.tintColor = [UIColor redColor];    

然后运行,这样是没有任何错误的。接下来将 development target,base sdk以及模拟器的版本都改成6.1(注意默认的xcode是没有6.1的sdk的,需要自己另外导入)。然后运行,就会报错:

也就是说tintColor属性在iOS6.1中根本就没有,在编译时候就会出错。这时候如下加上判断语句也是没有用的,照样报错(预处理,编译,运行的问题这里不再废话)

[objc]  view plain  copy
  1. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {    
  2.     self.window.tintColor = [UIColor redColor];    
  3. }   
遇见这种情况只能加上预处理语句,这样写:
[objc]  view plain  copy
  1. <del>#ifdef __IPHONE_7_0    
  2.     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {    
  3.         self.window.tintColor = [UIColor redColor];    
  4.     }    
  5. #endif</del>  


[objc]  view plain  copy
  1. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000  
  2. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {    
  3.         self.window.tintColor = [UIColor redColor];    
  4.     }    
  5. #endif  

[objc]  view plain  copy
  1. 其中__IPHONE_OS_VERSION_MAX_ALLOWED定义在usr/include/AvailabilityInternal.h中  
  2. #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED  
  3. /* make sure a default max version is set */  
  4. #ifndef __IPHONE_OS_VERSION_MAX_ALLOWED  
  5.         #define __IPHONE_OS_VERSION_MAX_ALLOWED     __IPHONE_7_0  
  6.     #endif  
  7. /* make sure a valid min is set */  
  8.     #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_2_0  
  9.         #undef __IPHONE_OS_VERSION_MIN_REQUIRED  
  10.         #define __IPHONE_OS_VERSION_MIN_REQUIRED    __IPHONE_2_0   
  11.     #endif  
  12. 。。。。  
  13. #endif  
  14. 注意需要加入头文件#import </usr/include/Availability.h>  
  15. 这样编译通过就不会报错了……这是因为在sdk6.1下的usr/include下边有一个Availability.h文件,里边定义了一大堆宏,其中关于iphone的有  
  16. #define __IPHONE_2_0     20000    
  17. #define __IPHONE_2_1     20100    
  18. #define __IPHONE_2_2     20200    
  19. #define __IPHONE_3_0     30000    
  20. #define __IPHONE_3_1     30100    
  21. #define __IPHONE_3_2     30200    
  22. #define __IPHONE_4_0     40000    
  23. #define __IPHONE_4_1     40100    
  24. #define __IPHONE_4_2     40200    
  25. #define __IPHONE_4_3     40300    
  26. #define __IPHONE_5_0     50000    
  27. #define __IPHONE_5_1     50100    
  28. #define __IPHONE_6_0     60000    
  29. #define __IPHONE_6_1     60100    
  30. #define __IPHONE_NA      99999  /* not available */   

而sdk7.0里边多了一行 

[objc]  view plain  copy
  1. #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。


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值