[iOS] 安全唯一的单例模式

Swift

swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可以看看这篇文章;

Swift 3.0 单例写法

代码:

import UIKit

class SingleOnce {

    // 单例
    static let shared = SingleOnce.init()
    private init(){}
    
    // 其他方法
    
    
}

这里将init方法私有化了,这样在其他地方就无法init,保证了单例的唯一性.

PS: 如果继承自其他类,init方法要加override关键字

使用:

使用单例

如果,在外部调用init方法,会编译报错:

无法外部初始化

Objective-C

在OC中, 我们可以这样写:

+ (instancetype)once {
    
    return [[self alloc] init];
    
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    
    static dispatch_once_t onceToken;
    static LQOnce *__once;
    dispatch_once(&onceToken, ^{
        __once = [[super allocWithZone:NULL]init];
    });
    
    return __once;
}

这样, 我们在使用的时候, 无论是调用once 方法, 还是init方法, 都会得到同一个实例对象:

LQOnce *once1 = [LQOnce once];
NSLog(@"%@", once1);
    
LQOnce*once2 = [[LQOnce alloc]init];
NSLog(@"%@", once2);

输出:



你可能感兴趣的:([iOS] 安全唯一的单例模式)