建立單例的兩種方式(懶漢式&GCD)
阿新 • • 發佈:2019-02-13
懶漢式:
// 建立靜態全域性變數
static id instance;
// 重寫allocWithZone方法
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
if (instance == nil) {
// 如果物件為空,那麼再加鎖(防止頻繁加鎖)
@synchronized(self) {
if (instance == nil) {
// 防止建立多次
instance = [super allocWithZone:zone];
}
}
}
return instance;
}
// 封裝一個初始化方法方便初始化物件的時候使用
+(instancetype)sharedLanHan
{
if (instance == nil) {
@synchronized(self) {
if (instance == nil) {
instance = [[super alloc] init];
}
}
}
return instance;
}
-(id)copyWithZone:(NSZone *)zone
{
// 防止copy時候產生新物件
return instance;
}
GCD:
// 建立靜態全域性變數
static id _instance;
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
// GCD確保程式碼只執行一次,並且有執行緒保護
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
+(id )sharedGCD
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[super alloc] init];
});
return _instance;
}
-(id)copyWithZone:(NSZone *)zone
{
return _instance;
}