美文网首页iOS Developer
iOS之dispatch_once创建单例

iOS之dispatch_once创建单例

作者: magicL1 | 来源:发表于2016-12-23 15:26 被阅读0次

单例是一种类,该类只能在第一次用的时候实例化一个对象,后期直接调用此对象(有点共享的意思)。

在Foundation框架中比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defaultManager和defaultCenter获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者似乎每几年就会改变他们的想法。他们也引入了一个很适合用于实现单例模式的函数。

该函数就是dispatch_once:

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。

dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。

如果被多个线程调用,该函数会同步等等直至代码块完成。

实际要如何使用这些呢?

好吧,假设有一个AccountManager类,你想在整个应用中访问该类的共享实例。你可以按如下代码简单实现一个类方法:

+ (AccountManager *)sharedManager {

static AccountManager *sharedAccountManagerInstance = nil;

static dispatch_once_t predicate;

dispatch_once(&predicate, ^{

sharedAccountManagerInstance = [[self alloc] init];

});

return sharedAccountManagerInstance;

}

这就意味着你任何时候访问共享实例,需要做的仅是:

AccountManager *accountManager = [AccountManager sharedManager];

就这些,你现在在应用中就有一个共享的实例,该实例只会被创建一次。

该方法有很多优势:

1 线程安全

2 很好满足静态分析器要求

3 和自动引用计数(ARC)兼容

4 仅需要少量代码

该方法的劣势就是它仍然运行创建一个非共享的实例:

AccountManager *accountManager = [[AccountManager alloc] init];

有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。

转。

相关文章

  • 利用dispatch_once创建单例

    利用dispatch_once创建单例 无论是爱还是恨,你都需要单例。 实际上每个iOS或Mac OS应用都至少会...

  • iOS之dispatch_once创建单例

    单例是一种类,该类只能在第一次用的时候实例化一个对象,后期直接调用此对象(有点共享的意思)。 在Foundatio...

  • iOS笔记之_单例

    iOS 单例 dispatch_once函数 dispatch_once函数中有两个参数,对于给定的一个predi...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • Effective Objective-C读后笔记(4)

    31、dispatch_once实现单例 使用dispatch_once实现单例设计模式。 32、多用枚举器,少用...

  • iOS 多线程面试题(使用dispatch_once实现单例)

    使用dispatch_once实现单例 热文推荐 2019 全网 iOS 面试题以及答案总结!

  • dispatch_once创建单例

    写蓝牙的时候,需要使用到单例,于是参照网上的例子,使用写了这样的一个单例,权当记录: dispatch_once被...

  • ios 单例

    单例写法 dispatch_once 上文是 dispatch_once的代码,可以看出通过predicate判断...

  • 单例

    使用GCD快速创建dispatch_once 1, 单例在外界容易被篡改: 在.h中添加提示语 +(instanc...

  • iOS-多线程(三)-GCD函数

    单次函数dispatch_once 单次函数一般用来创建单例或者是执行只需要执行一次的程序。 dispatch_o...

网友评论

    本文标题:iOS之dispatch_once创建单例

    本文链接:https://www.haomeiwen.com/subject/kgpkvttx.html