单例的写法(更新Swift2.1+)

在开发中我们常常会碰到需要一个类只有一个实例的需求,这个时候就要使用到单例,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 - 
- (id)copyWithZone:(NSZone *)zone {
    return instance_;
}

更新Swift 2.1+单例写法:

static let shareInstance = NetworkTools()
  • Swift中一行代码搞定,并且Swift中推举这样编写单例
    • Swift中单例的命名规范: 以share开头, 后面跟上Instance

你可能感兴趣的:(单例的写法(更新Swift2.1+))