下午帮同事改了一下午的代码,深深的被刺伤了,也深深的觉得代码架构的重要性,更深深的觉得应该好好的打磨一下设计模式。于是乎就钻研一下设计模式由易到难,先从iOS最简单的单例模式说起。
作为iOS最简单的设计模式—单例模式,主要的作用是:
- 保证了一个类在项目中只有唯一的实例。
- 节约了资源,减少不必要的开支。
怎样创建一个单例?
定义一个全局变量:
static Singleton * _instance =nil;
AI 代码解读
提供一个类方法接口,供外界调用:
+(instancetype)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance =[[super allocWithZone:NULL]init];
});
return _instance;
}
AI 代码解读
重写系统调用方法
我们实例化对象的时候通常会通过alloc、init或者copy的方法,当我们调用alloc方法时,OC内部会调用allocWithZone这个方法来申请内存。拷贝对象也是同样的原理,OC内部调用copyWithZone方法,所以我们需要重写这两个方法,从而保证实例的单一性:
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
return [Singleton shareInstance];
}
-(instancetype)copyWithZone:(struct _NSZone *)zone
{
return [Singleton shareInstance];
}
AI 代码解读
让我们调用一下:
Singleton *obj1=[Singleton shareInstance];
NSLog(@"obj1=%@",obj1);
Singleton *obj2=[Singleton shareInstance];
NSLog(@"obj2=%@",obj2);
Singleton *obj3=[[Singleton alloc]init];
NSLog(@"obj3=%@",obj3);
Singleton *obj4=[[Singleton alloc]init];
NSLog(@"obj4=%@",[obj4 copy]);
AI 代码解读
打印结果地址一致就大功告成:
2016-03-04 18:26:00.204 obj1=<Singleton: 0x7fd4a8406470>
2016-03-04 18:26:00.205 obj2=<Singleton: 0x7fd4a8406470>
2016-03-04 18:26:00.205 obj3=<Singleton: 0x7fd4a8406470>
2016-03-04 18:26:00.205 obj4=<Singleton: 0x7fd4a8406470>
AI 代码解读