OC / Swift 单例创建的三种方式
// OC
#import "Person.h"
static Person * person = nil;
@implementation Person
第一种: 不推荐 多线程环境下,这样是不能保证线程安全
+(instancetype)sharePerson{
if (person == nil) {
person = [[Person alloc]init];
}
person.age = 1;
return person;
}
第二种: 官网推荐第一种
+(instancetype)defaultPerson{
// 使用关键字 对对象加锁, 保证线程安全,这是推荐方法之一
@synchronized (person) {
if (person == nil) {
person = [[Person alloc]init];
}
}
return person;
}
第三种: 官网推荐方法二
+(instancetype)createPerson{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (person == nil) {
person = [[Person alloc]init];
}
});
return person;
}
@end
// Swift
1.
let _SingletonSharedInstance = Singleton()
class Singleton {
class var sharedInstance : Singleton {
return _SingletonSharedInstance
}
}
2.
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static let instance : Singleton = Singleton()
}
return Static.instance
}
}
3.
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!
}
}