您的位置:首页 > 移动开发 > IOS开发

蓝懿 ios技术交流和心得分享 2016年01月22日

2016-01-22 23:11 519 查看
苹果从iOS5开始提供了一个比较强大的工具UIAppearance,我们可以通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格。

方法介绍

+ (id)appearance
这个方法是统一全部改,比如你设置UINavBar的tintColor,你可以这样写:
[[UINavigationBar appearance] setTintColor:myColor];
[/code]
+ (id)appearanceWhenContainedIn:(Class <>)ContainerClass,...
这个方法可设置某个类的改变:例如:设置UIBarButtonItem 在UINavigationBar、UIPopoverController、UITabbar中的效果。就可以这样写
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UIPopoverController class],[UITabbar class] nil] setTintColor:myPopoverNavBarColor];
[/code]

使用注意

iOS8以后又添加了一些方法,这里就不做介绍了,我们开发中最长用到的还是第1种方法我们在查看方法或者属性的时候,若是看到方法或属性的后面是UI_APPEARANCE_SELECTOR的,我们就可以通过appearance统一设置相关的属性注意 : 使用appearance设置UI效果最好采用全局的设置,在所有界面初始化前开始设置,否则可能失效。

代码示例

统一设置TabBarItem的文字属性
- (void)setUpTabBarItemAttrs{
UITabBarItem *item = [UITabBarItem appearance];

NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:15];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];

NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor blackColor];
[item setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
}
单例(singleton)May 15, 2014[/code]

什么是单例模式

单例模式 是一个类在系统中只有一个实例对象。通过全局的一个入口点对这个实例对象进行访问。在iOS开发中,单例模式是非常有用的一种设计模式。可以保证在程序运行过程,一个类只有一个实例

实现单例模式的条件

实现单例模式有三个条件:类的构造方法是私有的类提供一个类方法用于产生对象类中有一个私有的自己对象针对于这三个条件,OC中都是可以做到的类的构造方法是私有的 我们只需要重写allocWithZone方法,让初始化操作只执行一次类提供一个类方法产生对象 这个可以直接定义一个类方法类中有一个私有的自己对象 我们可以在.m文件中定义一个属性即可

应用场景及注意点

应用场景某个类经常被使用(节约系统资源)定义工具类共享数据注意点不要继承单例类先创建子类永远是子类对象先创建父类永远是父类对象单例模式:懒汉模式
 : 第一次用到单例对象的时候再创建
饿汉模式
 : 一进入程序就创建一个单例对象

ARC

懒汉模式

#import "Singleton.h"
[/code]
@implementation

Singletonstatic id _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if (_instance == nil) { // 防止频繁加锁
@synchronized(self) {
if (_instance == nil) { // 防止创建多次
_instance = [super allocWithZone:zone];
}
}
}
return _instance;}+ (instancetype)sharedSingleton{
if (_instance == nil) { // 防止频繁加锁
@synchronized(self) {
if (_instance == nil) { // 防止创建多次
_instance = [[self alloc] init];
}
}
}
return _instance;}- (id)copyWithZone:(NSZone *)zone{
return _instance;}@end

饿汉模式(不常用)

#import "HMSingleton.h"
[/code]
@implementation

Singletonstatic id _instance;+ (void)load{
_instance = [[self alloc] init];}+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if (_instance == nil) { // 防止创建多次
_instance = [super allocWithZone:zone];
}
return _instance;}+ (instancetype)sharedSingleton{
return _instance;}- (id)copyWithZone:(NSZone *)zone{
return _instance;}@end

GCD实现单例模式

@implementation
[/code]
Singletonstatic id _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;}+ (instancetype)sharedSingleton{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;}- (id)copyWithZone:(NSZone *)zone{
return _instance;}@end

非ARC

在非ARC的环境下,需要再加上下面的方法:
重写release方法为空重写retain方法返回自己重写retainCount返回1重写autorelease返回自己
-
[/code]
(oneway void)release { }- (id)retain { return self; }- (NSUInteger)retainCount { return 1;}- (id)autorelease { return self;}
如何判断是否是ARC
#if __has_feature(objc_arc)
[/code]
//ARC环境

#else

//MRC环境

#endif

​
学习ios  重要还是要理清楚思路  在做或者看老师代码的时候 自己多想想为什么  不要自己看着就抄  另外还是要推荐一下 蓝懿IOS这个培训机构  和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!
                                                                  写博客第一百零四天;
                                                                                      QQ:565803433
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息