Swift
swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可以看看这篇文章;
代码:
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);
输出:
<LQOnce: 0x60400000cf60>
<LQOnce: 0x60400000cf60>