1.现有代码中存在的判断系统版本的宏定义如下:
#define IOS7_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"10.0"] != NSOrderedAscending )
这个问题出在,系统提供的这个compare方法,是从字符串第一位开始比较,而不是转成数字比较,当然啦,可以自定义自己的compare方法,那个暂不提。
打个比方:
NSLog(@"20.1和30.0比较结果:<%d>",[@"20.1" compare:@"30.0"] == NSOrderedAscending);
NSLog(@"20.1和100.1比较结果:<%d>",[@"20.1" compare:@"100.1"] == NSOrderedAscending);
输出结果:
2017-01-18 21:49:59.874 iOS-HHZUniversal[84263:1082496] 20.1和30.0比较结果:<1>
2017-01-18 21:49:59.875 iOS-HHZUniversal[84263:1082496] 20.1和100.1比较结果:<0>
可以看到,输出结果并不是我们所期望的,因为字符串第一位比较完之后就出结果了。
2.改为获取系统版本后转为float类型再比较[[[UIDevice currentDevice] systemVersion] floatValue],但是需要注意的是,发现有的项目组比较是这样的:
[[[UIDevice currentDevice] systemVersion] floatValue] >= 10.2
这样有个问题是,10.2在编译器缺省是double类型,会导致某些情况下异常,比如:
NSLog(@"正常比较:");
NSLog(@"正常比较10.2>=10.2<%d>",10.2 >= 10.2);
NSLog(@"正常比较10.2<=10.2<%d>",10.2 <= 10.2);
NSLog(@"读取系统版本比较:");
NSLog(@"系统版本>=10.2<%d>",[[[UIDevice currentDevice] systemVersion] floatValue] >= 10.2);
NSLog(@"系统版本<=10.2<%d>",[[[UIDevice currentDevice] systemVersion] floatValue] <= 10.2);
输出结果:
2017-01-18 22:01:43.301 iOS-HHZUniversal[94914:1113619] 正常比较:
2017-01-18 22:01:43.302 iOS-HHZUniversal[94914:1113619] 正常比较10.2>=10.2<1>
2017-01-18 22:01:43.303 iOS-HHZUniversal[94914:1113619] 正常比较10.2<=10.2<1>
2017-01-18 22:01:43.303 iOS-HHZUniversal[94914:1113619] 读取系统版本比较:
2017-01-18 22:01:43.304 iOS-HHZUniversal[94914:1113619] 系统版本>=10.2<0>
2017-01-18 22:01:43.304 iOS-HHZUniversal[94914:1113619] 系统版本<=10.2<1>
2017-01-18 22:01:43.351 iOS-HHZUniversal[94914:1113619] <网络请求(加密前):1>
系统版本>=10.2居然是0,其实这就是精度问题导致的,你可以发现实际是10.1999999xxxxxxxxx。
所以,需要给10.2显示转换为float。用下面方式比较即可:
[[[UIDevice currentDevice] systemVersion] floatValue] >= 10.2f