在实际的开发过程中,为了避免在不同的系统版本中报找不到方法的错误从而导致系统崩溃,我们常常需要对不同的版本进行适配,现总结常用的系统适配方法如下:
- 方法一
```objc
NSString *version = [UIDevice currentDevice].systemVersion;
if (version.doubleValue >= 8.0) { // iOS系统版本 >= 8.0
}
```
得到系统版本号,然后与想要适配的版本号进行比对,决定执行哪个方法
- 方法二
NSString *version = [UIDevice currentDevice].systemVersion; if ([version compare:@"8.0"] != NSOrderedAscending) { // iOS系统版本 >= 8.0
}
与方法二类似,得到版本号后,调用compare方法与想要适配的版本号进行比对,返回结果有三种
objc
NSOrderedAscending 升序(右边 > 左边)
NSOrderedSame 相等、相同
NSOrderedDescending 降序(右边 < 左边)
```
根据自己的需求,是想升序还是降续来决定需要进行比较的对象
-
方法三
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_8_0) { // iOS系统版本 >= 8.0 }
比较NSFoundation的版本号
-
方法四:
if (NSClassFromString(@"UIAlertController")) { // iOS系统版本 >= 8.0
}
```
通过比较当前版本是否支持UIAlertController方法,来判断当前版本号
- 方法五:
if ([@"" respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) { // iOS系统版本 >= 7.0
}
当前对象是否实现了特定版本号的某些方法,从而实现版本适配。在方法判断的过程中一定要仔细辨认是类方法还是对象方法
```objc
[@"jack" respondsToSelector:@selector(length)] // 判断是否有-length这个对象方法
[@"jack" length]
[NSString respondsToSelector:@selector(length)] // 判断是否有+length这个类方法
[NSString length]
[NSString instancesRespondToSelector:@selector(length)] // 判断是否有-length这个对象方法
[@"" length]