单例模式
- 单例是设计模式中十分常见的一种,在iOS开发中也会经常用到。
- 当有多处代码块需要使用同一个对象实例时,单例模式可以保证在程序运行过程,一个类只有一个实例(而且该实例易于供外界访),从而方便地控制了实例个数,节约系统资源
单例的实现
- 类的
alloc
方法内部其实调用了allocWithZone:
方法。创建一个该类的静态实例,重写此方法,访问时为若静态实例为nil,则调用super allocWithZoen:
返回实例
- 倘若发生多线程同时访问,可能会创建多份实例,因此需要加锁
@synchronized
或GCD的一次性代码(常用)控制实现只创建一份
- 为符合代码规范,一般在实现单例模式时,会给这个类提供类方法方便外界访问,方法名用
default
| shared
开头以表明身份(这样其他人调用时,一看方法名就知道是单例类了)
- 完善起见,还要重写
copyWithZone
与mutableCopyWithZone:
方法(需要先遵守NSCopying
与NSMutableCopying
协议)
@implementation Tool
static Tool *_instance = nil;
+(instancetype)allocWithZone:(struct _NSZone *)zone{
/*
@synchronized(self) {
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
}
return _instance;
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
});
return _instance;
}
+(instancetype)sharedTool{
return [[self alloc] init];
}
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
@end