方法一、(官方版)
這個方法為蘋果公司官方的方法;
static id _sharedManager = nil;
+ (instancetype)defaultManager {
if (_sharedManager == nil) {
_sharedManager = [[super allocWithZone:NULL] init];
}
return _sharedManager;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
return [self sharedManager];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
解釋:
[[Class alloc] init];
其實是做了兩件事姆钉。 alloc 給對象分配內(nèi)存空間说订,init是初始化對象,包括設置成員變量初值等潮瓶。而給對象分配空間陶冷,除了alloc方法之外,還有另一個方法: + (instancetype)allocWithZone:
毯辅。
而使用alloc方法初始化一個類的實例的時候埂伦,默認調(diào)用了+ (instancetype)allocWithZone:
方法,所以創(chuàng)建單例覆蓋這個方法也是必須的了思恐。
方法二沾谜、(完整版)
//全局變量
static id _sharedManager = nil;
//單例方法
+(instancetype)shareManager{
return [[self alloc] init];
}
//初始化方法
- (instancetype)init{
// 只進行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedManager = [super init];
});
return _sharedManager;
}
//alloc會調(diào)用allocWithZone:
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//只進行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedManager = [super allocWithZone:zone];
});
return _sharedManager;
}
//如果不刻意調(diào)用[object copy]?方法,下面的方法可以不使用
//copy會調(diào)用copyWithZone:
- (id)copyWithZone:(NSZone *)zone{
return _sharedManager;
}
+ (id)copyWithZone:(struct _NSZone *)zone{
return _sharedManager;
}
//mutableCopy會調(diào)用mutableCopyWithZone:
- (id)mutableCopyWithZone:(NSZone *)zone{
return _sharedManager;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
return _sharedManager;
}
解釋:
dispatch_once不僅意味著代碼僅會被運行一次壁袄,而且還是線程安全的类早,這就意味著你不需要使用諸如@synchronized之類的來防止使用多個線程或者隊列時不同步的問題。
對象是可以被copy/mutableCopy的嗜逻,為了讓被copy的對象也是“唯一”的涩僻,需要覆蓋copy/mutableCopy的方法(如果可以保證不使用copy方法可以忽略這些方法的覆蓋)
方法三、(簡易版)
確保項目中只使用[Class shareManager]
調(diào)用該類時可以用這個簡易的方法。不能使用[[Class alloc] init];[object copy];
這些方法調(diào)用呦~
+ (instancetype)shareManager {
static ZingChatManager *_sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedManager = [[Class alloc] init];
});
return _sharedManager;
}