在项目中我们经常会用到单例类,觉得很方便,但是其弊端也很明显:单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
如何写一个安全的单例类呢?看声明文件
#import <Foundation/Foundation.h>
@interface DanLi : NSObject<NSCopying,NSMutableCopying>
//单例类
+ (instancetype)sharedInstance;
@end
再看实现文件
#import "DanLi.h"
@implementation DanLi
static DanLi *instance = nil;
+ (instancetype)sharedInstance {
return [[self alloc]init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
if(!instance){
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
}
return instance;
}
- (id)copyWithZone:(struct _NSZone *)zone {
return [DanLi sharedInstance];
}
-(instancetype)mutableCopyWithZone:(NSZone *)zone{
return [DanLi sharedInstance];
}
//new方法不需要重写
- (DanLi *)init {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(!instance){
instance = [super init];
}
return instance;
}
@end