在iOS中,单例模式是比较常用的一种模式,保证相关代码只会执行一次,但有时候会有一种场景,需要销毁单例进行重建。
如果不采用GCD提供的dispatch_once方法,需要加锁操作,是比较耗性能的。
那么这个时候如何继续采用dispatch_once方法?
dispatch_once_t的描述是:
typedef long dispatch_once_t;
dispatch_once在判断是否需要执行的关键语句:
if(DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
dispatch_once_f(predicate, context, function);
}
可以了解到 dispatch_once_t参数的初始值就是0l,只需要重置dispatch_once_t参数及实例参数,具体代码如下:
static SpTest *sInstance = nil;
static dispatch_once_t onceToken;
+ (instancetype)sharedManager
{
dispatch_once(&onceToken, ^{
sInstance= [[self alloc] init];;
NSLog(@"dispatch once");
});
return sInstance;
}
+ (void)tearDown{
sInstance=nil;
onceToken=0l;
}
回过头来想想,其实这样实现是一种比较粗陋的方式,需要考虑在销毁的同时实例的使用状况等,其实是违背dispatch_once使用的初衷的。
不排除真的有这种单例需要销毁的场景,但多数需要销毁的单例实际上可能不适用于单例这种模式,可能需要重新考虑架构设计问题。