OC单例
1.使用GCD(推荐使用)
+ (instancetype)sharedInstance { static Singleton *shared = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared = [[Singleton alloc] init]; }); return _shared; }
2.单线程模式单例
+(Manager *)defaultManager{ static Singleton *manager = nil; if(!manager){ manager=[[Singleton alloc] init]; } return manager; }
此单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。
3.多线程加锁单例
// @synchronized加锁 +(instancetype)defaultManager { static Singleton *singleton; @synchronized (self) { if (!singleton) { singleton = [[Singleton alloc] init]; } } return singleton; }
加锁以后,当多个线程同时调用defaultManager时,由于@synchronized已经加锁,只能有一个线程创建Singleton实例。这样就解决了第一种情况的弊端。
缺点:只有在Singleton未创建时,加锁才是必要的。如果singleton已经创建,这个时候还加锁的话,会影响性能。
swift单例
1.方式一:类常量(建议使用)
static let sharedInstance = Singleton()
2.方式二:嵌套结构体变量格式
class Singleton { class var sharedInstance: Singleton { struct Static { static let instance: Singleton = Singleton() } return Static.instance } }
3.方式三:类似OC的创建方式dispatch_once
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! } }