Swift单例模式
单例模式
单例模式的作用是解决“应用中只有一个实例”的一类问题。在Cocoa Touch框架中,有UIApplication、NSUserDefaults和NSNotificationCenter等单例类。另外,NSFileManager和NSBundle类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用(Cocoa框架中的单例类有NSFileManager、NSWorkspace和NSApplication等)。
很多人都熟悉OC的单例创建的方式,使用NSLock、@synchronized等锁,所用GCD的dispatch-once创建等..
但是Swift作为一个新的语言,跟OC的区别还是蛮大的,
那么怎么私用Swift创建一个单例呢?
单例模式的实现有很多方案,苹果公司在《UsingSwift with Cocoa and Objective-C》官方文档中给出了一种单例模式的实现。最简单形式代码如下:
class Singleton {
static let sharedInstance = Singleton()
}
是的就是这么简单,上述代码采用static的类属性实现单例模式,这种类属性只被延迟加载执行一次,即便是在多线程情况下也只是执行一次,并且保证是线程安全的。
当然这里使用了全局变量而非类变量,是因为不支持类变量
与类不同,结构可以定义静态变量,通过使用此方法,将静态变量升级为类变量(在支持类变量之前,推荐此方法)
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static let instance : Singleton = Singleton()
}
return Static.instance
}
}
如果我们想要有更多的初始化,我么也可以使用闭包的形式创建
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// 初始化处理
return instance
}()
}
当然很多人会想到dispatch-once,因为OC这样的创建方式已经习惯了,
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static var onceToken : dispatch_once_t = 0
static var instance : Singleton? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = Singleton()
}
return Static.instance!
}
}
但是Swift3.0取消了once的实现,
所以我们只能自己来实现.
extension DispatchQueue {
private static var _onceTracker = [String]()
public class func once(_ token: String, block:()->Void) {
objc_sync_enter(self)
defer { objc_sync_exit(self) }
if _onceTracker.contains(token) {
return
}
_onceTracker.append(token)
block()
}
}
那么我们创建的方式一样可以使用once
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static var onceToken = NSUUID().uuidString//可以自定一个值......
static var instance : Singleton? = nil
}
DispatchQueue.once(Static.onceToken) {
Static.instance = Singleton()
}
return Static.instance!
}
}
当然单例模式的创建,我只是列举了几个例子,至于在应用中如何使用,使用哪一个,可以根据需求来定….
欢迎访问我的系列博客
系列:iOS开发-前言+大纲
http://blog.csdn.net/spicyShrimp/article/details/62218521