前言
这些天在研究利用Objective-C的runtime的method swizzling,发现简直是黑魔法啊,有兴趣的同学可以看看,链接传送门:http://nshipster.com/swift-objc-runtime/
看到里面使用dispatch_once来实现的单例,保证线程安全,我在这篇文章中也分享下我对Swift单例的理解与用法吧
单例的英文: Singleton
我所了解在Swift中有三种实现单例的方法,科学的在前面 :)
1. 类常量 Class Constant
在Swift1.2,Swift2以上的童鞋们请自觉考虑这种方法
class Singleton {
static let sharedInstance: Singleton = Singleton()
}
这是一个会被整个当前class所分享的常量,并且不会被subclass所override,let保证了这个是线程安全滴。同时Swift在这里很机智的实现了懒加载,所以变得更加科学了。
不过注意Swift1.2以下是不支持,如果要考虑到向下兼容,请看继续看下面的方法。
2. Nested结构
class Singleton {
class var sharedInstance {
struct SharedStatic {
static let instance: Singleton = Singleton()
return SharedStatic.instance
}
}
}
这样写也很科学,虽然长了很多,至少是安全并且合理的。这里的class var就是静态变量,class func同理是静态函数,就像是static function一样的感觉。
3. GCD的dispatch_once
class Singleton {
class var sharedInstance {
struct SharedStatic {
static var token: dispatch_once_t = 0
static var instance: Singleton? = nil
}
dispatch_once(&SharedStatic.token) { SharedStatic.instance = Singleton() }
return SharedStatic.instance!
}
}
这是传统Objective-C处理单例的写法,熟悉GCD的童鞋应该都了解过,不知道为何在国内很多文章中这种做法是被首推的,在我查阅了许多国内外的文档之后,基本确认这种方法相对于上面两种没有任何优势,除了看起来比较牛逼。