iOS中的单例模式如何销毁重建

在iOS中,单例模式是比较常用的一种模式,保证相关代码只会执行一次,但有时候会有一种场景,需要销毁单例进行重建。
如果不采用GCD提供的dispatch_once方法,需要加锁操作,是比较耗性能的。
那么这个时候如何继续采用dispatch_once方法?
dispatch_once_t的描述是:

typedef long dispatch_once_t;

GCD创建:dispatch_once中dispatch_once_t类型为typedef long
• onceToken= 0,线程执行dispatch_once的block中代码
• onceToken= -1,线程跳过dispatch_once的block中代码不执行
• onceToken= 其他值,线程被线程被阻塞,等待onceToken值改变
用途:限制创建,提供全局调用,节约资源和提高性能。参考
常见的应用场景:
• UIApplication
• NSNotificationCenter
• NSFileManager
• NSUserDefaults
• NSURLCache
• NSHTTPCookieStorage

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使用的初衷的。
不排除真的有这种单例需要销毁的场景,但多数需要销毁的单例实际上可能不适用于单例这种模式,可能需要重新考虑架构设计问题。

链接:https://www.jianshu.com/p/82ba1af6bbdc

你可能感兴趣的:(iOS中的单例模式如何销毁重建)