在开发中我们常常会碰到需要一个类只有一个实例的需求,这个时候就要使用到单例,OC(ARC)中格式如下
#pragma mark - 单例
/** 静态实例,并初始化*/
static id instance_;
/** 实例构造检查静态实例是否为nil*/
+(instancetype)sharedInstance {
/**
该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance_ = [[self alloc] init];
});
return instance_;
}
/**
重写allocWithZone方法
重写这个方法的原因是alloc init的时候会调用到allocWithZone
重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例
*/
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance_ = [super allocWithZone:zone];
});
return instance_;
}
#pragma mark - <NSCoping>
- (id)copyWithZone:(NSZone *)zone {
return instance_;
}
更新Swift 2.1+单例写法:
static let shareInstance = NetworkTools()
- Swift中一行代码搞定,并且Swift中推举这样编写单例
- Swift中单例的命名规范: 以share开头, 后面跟上Instance