懒汉式:
// 创建静态全局变量
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;
}