ios类初始化以及版本适配
2014-05-29 10:29
609 查看
在看SMPageController源码的时候,发现如下代码
发现了自己以前遗漏了的知识
首先是 +(void)initialize 方法
查看文档,解析如下
大概意思就是说在类初始化的时候会调用该方法
另一个就是怎样判断当前系统版本的方式
最后一个就是下面这一段的宏定义了
这段代码的作用是,当我们的basesdk(编译的sdk)是7.0的时候,就执行
否则执行
那这和我们上面通过systemVersion的方法来获得系统版本的方法有什么不同呢,为什么不能替换呢?
首先我们新建一个工程,在AppDelegate.m里面添加下面一句简单的代码
然后我们看看项目的配置
项目部署环境是ios7.1
编译环境也是7.1
然后运行项目,一切是那么的正常
下面我们把项目的部署环境改为ios6.0,并且选择6.0的模拟器来运行
运行项目,项目报错
原因是在ios6里面,并没有setTintColor这个方法
因为是用7.1的环境编译的,编译的时候能找到改方法,但是到了6.0的运行环境是,由于6.0没有该方法,于是代码运行到那里的时候就报错了
看到这里你就应该知道上面为什么在这种情况下,不能用systemVersion来做判断了吧
参考文章:http://www.it165.net/pro/html/201403/10825.html
+ (void)initialize { NSString *reqSysVer = @"7.0"; NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) { _defaultStyleForSystemVersion = SMPageControlDefaultStyleModern; } else { _defaultStyleForSystemVersion = SMPageControlDefaultStyleClassic; } } - (void)_initialize { _numberOfPages = 0; _tapBehavior = SMPageControlTapBehaviorStep; self.backgroundColor = [UIColor clearColor]; // If the app wasn't linked against iOS 7 or newer, always use the classic style // otherwise, use the style of the current OS. #ifdef __IPHONE_7_0 [self setStyleWithDefaults:_defaultStyleForSystemVersion]; #else [self setStyleWithDefaults:SMPageControlDefaultStyleClassic]; #endif _alignment = SMPageControlAlignmentCenter; _verticalAlignment = SMPageControlVerticalAlignmentMiddle; self.isAccessibilityElement = YES; self.accessibilityTraits = UIAccessibilityTraitUpdatesFrequently; self.accessibilityPageControl = [[UIPageControl alloc] init]; self.contentMode = UIViewContentModeRedraw; }
发现了自己以前遗漏了的知识
首先是 +(void)initialize 方法
查看文档,解析如下
大概意思就是说在类初始化的时候会调用该方法
另一个就是怎样判断当前系统版本的方式
NSString *reqSysVer = @"7.0"; NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) { _defaultStyleForSystemVersion = SMPageControlDefaultStyleModern; } else { _defaultStyleForSystemVersion = SMPageControlDefaultStyleClassic; }或者
if([[UIDevice currentDevice]systemVersion].floatValue < 7.0) { //dosomething }
最后一个就是下面这一段的宏定义了
#ifdef __IPHONE_7_0 [self setStyleWithDefaults:_defaultStyleForSystemVersion]; #else [self setStyleWithDefaults:SMPageControlDefaultStyleClassic]; #endif
这段代码的作用是,当我们的basesdk(编译的sdk)是7.0的时候,就执行
_defaultStyleForSystemVersion = SMPageControlDefaultStyleModern;
否则执行
_defaultStyleForSystemVersion = SMPageControlDefaultStyleClassic;
那这和我们上面通过systemVersion的方法来获得系统版本的方法有什么不同呢,为什么不能替换呢?
首先我们新建一个工程,在AppDelegate.m里面添加下面一句简单的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window.tintColor = [UIColor redColor]; return YES; }
然后我们看看项目的配置
项目部署环境是ios7.1
编译环境也是7.1
然后运行项目,一切是那么的正常
下面我们把项目的部署环境改为ios6.0,并且选择6.0的模拟器来运行
运行项目,项目报错
原因是在ios6里面,并没有setTintColor这个方法
因为是用7.1的环境编译的,编译的时候能找到改方法,但是到了6.0的运行环境是,由于6.0没有该方法,于是代码运行到那里的时候就报错了
看到这里你就应该知道上面为什么在这种情况下,不能用systemVersion来做判断了吧
参考文章:http://www.it165.net/pro/html/201403/10825.html
相关文章推荐
- iOS版本兼容以及部分iOS 11适配
- 如何判断一个类是否支持某属性和方法以及如何判断IOS的版本
- Xcode4.2、iOS各版本以及ARMv6、ARMv7编译架构介绍
- iOS版本和尺寸适配的整理
- iOS多版本多设备适配的问题
- 【版本适配】iOS中文本的自适应高度
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 【iOS开发-6】iOS框架以及手册的在线阅读和PDF版本的iOS Technology Overview下载
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)
- 如何判断一个类是否支持某属性和方法以及如何判断IOS的版本
- iOS程序版本判断,以及查询接口官方介绍
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 判断一个类是否支持某属性和方法以及如何判断IOS的版本
- IOS开发之不同版本适配问题3(#ifdef __IPHONE_7_0 BaseSDK Development Target)
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- IOS UIGraphicsBeginImageContextWithOptions 版本适配问题
- (ios实战)单个ViewControl适配不同ios版本xib文件实现
- IOS 实现自定义的导航栏背景以及自定义颜色的状态栏(支持7.0以及低版本)
- IOS:版本适配