OC / Swift 单例创建的三种方式

2016-11-22  本文已影响98人  努力奔跑的小男孩

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

}

}

上一篇下一篇

猜你喜欢

热点阅读