iOS 单例销毁重建

2017-09-07  本文已影响528人  ShanJiJi

在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使用的初衷的。

不排除真的有这种单例需要销毁的场景,但多数需要销毁的单例实际上可能不适用于单例这种模式,可能需要重新考虑架构设计问题。

作者:HappyCoco
链接:http://www.jianshu.com/p/82ba1af6bbdc

上一篇下一篇

猜你喜欢

热点阅读