单例是一个在Cocoa 中很常见的模式了。对于一些希望能在全局方便访问的实例,或者在App 的生命周期中只应该存在一个的对象,我们一般都会使用单例来存储和访问。在Objective-C 中单例的公认的写法类似下面这样:
//使用GCD 中的dispatch_once_t 可以保证里面的代码只被调用一次,以此保证单例在线程上的安全。
+ (instancetype)sharedManager {
static Object *obj = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
obj = [[Object alloc] init];
});
return obj;
}
在Swift 中由于废弃了原有的Dispatch once方法,因此无法使用once 进行单例的创建。
我们使用一个struct 来存储类型变量。并且我们使用一个更简单的保证线程安全的方式,那就是let。
我们使用一个struct 来存储类型变量。并且我们使用一个更简单的保证线程安全的方式,那就是let。
class Manager {
class var sharedManager: Manager {
struct Static {
static let sharedInstance: Manager = Manager()
}
return Static.sharedInstance
}
}
还有一种方法更受大家欢迎的做法。与上方的写法类似:
class Manager {
class var sharedManager: Manager {
return sharedInstance
}
}
private let sharedInstance = Manager()
最后一种方法更受大家喜欢,也最简单。如果没有特别的需求,建议都使用这样的方式实现单例。
class Manager{
static let sharedInstance = Manager()
}








网友评论