单例

单例_第1张图片
单例模式.jpg

在项目中我们经常会用到单例类,觉得很方便,但是其弊端也很明显:单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。

如何写一个安全的单例类呢?看声明文件

#import 

@interface DanLi : NSObject

//单例类
+ (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

你可能感兴趣的:(单例)