單例模式的實現
單例是一種很常見的模式,它的原理就是使程序運行過程中,某個類只有一個實例,無論以什么方式創建,都返回同一個實例化對象。它的具體實現代碼如下所示:
@implementation WJTool
//提供一個static修飾的全局靜態變量,這句代碼保證了單例的生命周期是整個函數
static WJTool *_instance;
//alloc內部會調用這個方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//之前普遍的寫法,但是并不能保證線程安全
/*
@synchronized (self) {
if (_instance==nil) {
_instance = [super allocWithZone:zone];
}
} */
//為了既能使創建實例的代碼只執行一次,并且保證線程安全,這里使用GCD的一次性函數最好不過
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance=[super allocWithZone:zone];
});
return _instance;
}
//一般情況下,工具類都會提供一個類方法來供外界調用
+(instancetype)shareTool{
return [[self alloc]init];
}
//嚴謹起見,重寫copyWithZone和MutableCopyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
單例的簡潔實現:
在開發中,為了提高編碼效率,并且這個單例是自己在已知的情況下調用,可以采用簡單的方法實現:
+(instancetype)shareTool
{
static WJTool *_instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc]init];
});
return _instance;
}
xcode.png