介绍
单例模式在开发中尤为常见,最大的好处就是内存中只会保留一个对象,节省内存开销,同时便于对象的建立和维护。
一个简单的单例
class Singleton { static let sharedInstance = Singleton() }
这个单例,如此的简单那么他是线程安全的吗?答案是—————是!而且他也是懒加载的!原因很简单,let定义的属性本身就是thread safe的,同时static定义的是一个class constant,拥有全局作用域和懒加载特性。Swift的单例实现是不是简单得令人发指?!(当然这是在Swift1.2才支持的)
如果你是Swift1.2以下的你可以这么写
class Singleton { class var shared: Singleton { return Inner.instance } struct Inner { static let instance: Singleton = Singleton() } }
用GCD来实现线程安全
class Singleton { class var shared: Singleton { if Static.instance != nil{ dispatch_once(&Static.onceToken) { Static.instance = Singleton() } } return Static.instance! } struct Static { static var instance: Singleton? static var onceToken: dispatch_once_t = 0 } }
这个实现大家应该相当熟悉,这里就不再过多介绍了。