(iOS)记一次修改判断系统版本的宏定义

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

你可能感兴趣的:((iOS)记一次修改判断系统版本的宏定义)