单例模式的实现
单例是一种很常见的模式,它的原理就是使程序运行过程中,某个类只有一个实例,无论以什么方式创建,都返回同一个实例化对象。它的具体实现代码如下所示:
@implementation WJTool
//提供一个static修饰的全局静态变量,这句代码保证了单例的生命周期是整个函数
static WJTool *_instance;
//alloc内部会调用这个方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//之前普遍的写法,但是并不能保证线程安全
/*
@synchronized (self) {
if (_instance==nil) {
_instance = [super allocWithZone:zone];
}
} */
//为了既能使创建实例的代码只执行一次,并且保证线程安全,这里使用GCD的一次性函数最好不过
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance=[super allocWithZone:zone];
});
return _instance;
}
//一般情况下,工具类都会提供一个类方法来供外界调用
+(instancetype)shareTool{
return [[self alloc]init];
}
//严谨起见,重写copyWithZone和MutableCopyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
单例的简洁实现:
在开发中,为了提高编码效率,并且这个单例是自己在已知的情况下调用,可以采用简单的方法实现:
+(instancetype)shareTool
{
static WJTool *_instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc]init];
});
return _instance;
}