纯C环境下
- pthread_once
static void * shareApplicationInfo;
//初始化函数
void initApplicationInfo() {
shareApplicationInfo = malloc(sizeof(1));
}
void * getApplicationInfo() {
static pthread_once_t token = PTHREAD_ONCE_INIT;
pthread_once(&token,&initApplicationInfo);
return shareApplicationInfo;
}
- dispatch_once 需要引libdispatch库
- block写法
NSObject * getOCApplicationInfo() {
static NSObject * __shareOCApplicationInfo;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
__shareOCApplicationInfo = [[NSObject alloc] init];
});
return __shareOCApplicationInfo;
}
- block 函数指针写法 跟pthread_once用法相似
static NSObject * __shareOCApplicationInfo2;
void initOC2ApplicationInfo(void * context) {
__shareOCApplicationInfo2 = [[NSObject alloc] init];
}
NSObject * getOC2ApplicationInfo() {
static dispatch_once_t onceToken;
dispatch_once_f(&onceToken, NULL, initOC2ApplicationInfo);
return __shareOCApplicationInfo2;
}
- swift
- 一般写法
public class MySwiftManager {
var some: String? = ""
fileprivate init() {}
}
public let mySwiftManager: MySwiftManager = MySwiftManager()
- 一般写法2 兼容OC
public final class MySwiftManager2: NSObject {
var some: String? = ""
fileprivate override init() {
super.init()
}
@objc public static let share: MySwiftManager2 = MySwiftManager2()
}
- 可以在初始化完成后做一些事的写法
public final class MySwiftManager {
var some: String? = ""
fileprivate init() {}
}
public let mySwiftManager: MySwiftManager = {
let value = MySwiftManager()
value.some = "mySwiftManager"
return value
}()
备注: 尽量让单例的init方法私有, 不要暴露出去,除非你确定需要这么做
tips: 如果是个单例 init 方法私有, 用final 修饰类
关于命名:单例用share(我们一般是用的这种模式), default 默认的实例, 我们可以自已再初始化实例。(参考UIApplication.shared , NotificationCenter.default)
网友评论