在iOS中栓霜,單例模式是比較常用的一種模式,保證相關(guān)代碼只會(huì)執(zhí)行一次横蜒,但有時(shí)候會(huì)有一種場(chǎng)景胳蛮,需要銷毀單例進(jìn)行重建。
如果不采用GCD提供的dispatch_once方法丛晌,需要加鎖操作仅炊,是比較耗性能的。
那么這個(gè)時(shí)候如何繼續(xù)采用dispatch_once方法澎蛛?
dispatch_once_t的描述是:
typedef long dispatch_once_t;
dispatch_once在判斷是否需要執(zhí)行的關(guān)鍵語(yǔ)句:
if(DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
dispatch_once_f(predicate, context, function);
}
可以了解到 dispatch_once_t參數(shù)的初始值就是0l抚垄,只需要重置dispatch_once_t參數(shù)及實(shí)例參數(shù),具體代碼如下:
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;
}
回過頭來(lái)想想谋逻,其實(shí)這樣實(shí)現(xiàn)是一種比較粗陋的方式呆馁,需要考慮在銷毀的同時(shí)實(shí)例的使用狀況等,其實(shí)是違背dispatch_once使用的初衷的毁兆。
不排除真的有這種單例需要銷毀的場(chǎng)景浙滤,但多數(shù)需要銷毀的單例實(shí)際上可能不適用于單例這種模式,可能需要重新考慮架構(gòu)設(shè)計(jì)問題气堕。