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!

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例:意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单...
    CoderZS阅读 613评论 1 13
  • 在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的。一个状态管理的例子大家都很熟悉,那就是单例。使用Swift...
    Tank丶Farmer阅读 6,413评论 0 5
  • 在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死...
    不要重名就好阅读 556评论 0 0
  • 一 、OC中单例的写法:1.普通单例的写法 2. 利用多线程来写单例 #pragma mark --- 普通单例写...
    天涯海角我爱你阅读 1,790评论 0 3
  • 尽管在我之前的博文里我就写过关于管理状态的那些坑,但是有时候我们就是无法避免它们。其中一类管理状态的方式我们耳熟能...
    一黑阅读 312评论 0 1