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!
}
}