開發(fā)過程中單例用的比較多糟描,但是一些細(xì)節(jié)的地方之前確實沒怎么注意,我們常用的單例聲明
#import "Share.h"
static Share *instance = nil;
@implementation Share
+ (instancetype)shareInit
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[Share alloc] init];
});
return instance;
}
在頭文件聲明一個屬性
@property(nonatomic,strong)NSString *name;
在一些需要登錄的項目中册倒,可能會用這個單例對象記錄一些登錄用戶信息蚓挤,
Share *share = [Share shareInit];
share.name = @"xiaoming";
切換登錄用戶的時候需要把一些共享信息清除掉,起初我是這樣
Share *share = [Share shareInit];
share = nil;
但發(fā)現(xiàn)再次調(diào)用這個單例對象驻子,他還是存在灿意,這點(diǎn)源于我渣渣的c語言基礎(chǔ),
share = nil;
這句話只是把指向單例對象的這個share指針指向了nil崇呵,單例對象并沒有改變缤剧,所以我在單例類中再加一個銷毀的方法
+ (void)remove
{
instance = nil;
}
在切換登陸的時候我調(diào)用這個方法,over域慷,等等荒辕,貌似有點(diǎn)別的問題,我怎么再次創(chuàng)建這個單例呢犹褒,沒辦法抵窒,dispatch_once是在app整個生命周期內(nèi)只會調(diào)用一次的,所以remove方法中不能這樣寫,改成下邊
+ (void)remove
{
instance.name = nil;
}
這是一種方法叠骑,另外一種途徑是改寫單例方法
+ (instancetype)shareInit
{
@synchronized (self) {
if (!instance) {
instance = [Share new];
}
}
return instance;
}
這樣在這個單例remove方法中直接把這個靜態(tài)變量置為nil就可以了李皇,切換登錄再次給這個靜態(tài)變量賦新值就可以了,這個小問題之前沒有注意過宙枷,也因為自己c語言基礎(chǔ)不夠扎實掉房,基礎(chǔ)還是重要啊