网上已经有方法了,我这里就是抄了下,原文链接
http://bj007.blog.51cto.com/1701577/649413
http://blog.csdn.net/u010124617/article/details/28856711?utm_source=tuicool
这里的dispatch_once_t就是一个用于标记的整型,没什么特殊之处。
用dispatch_once实现单例的最大好处就是线程安全!!这个经常会被面试问到,建立数据库和网络操作的单例时,确实存在线程安全问题。
先看oc的
+ (AccountManager *)sharedManager { static AccountManager *sharedAccountManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedAccountManagerInstance = [[self alloc] init]; }); return sharedAccountManagerInstance; }
再看swfit的,这里使用了内部的struct是因为目前swift的class中不支持static定义类属性。
class SwiftSingleton{ class func shareInstance()->SwiftSingleton{ struct YRSingleton{ static var predicate:dispatch_once_t = 0 static var instance:SwiftSingleton? = nil } dispatch_once(&YRSingleton.predicate,{ YRSingleton.instance=SwiftSingleton() } ) return YRSingleton.instance! } }