[Objective-C] 用 dispatch_once 实现单例

转载 2015年07月11日 09:50:30

转自:

http://blog.csdn.net/ryantang03/article/details/8622415

http://www.raywenderlich.com/46988/ios-design-patterns

https://www.bignerdranch.com/blog/dispatch_once-upon-a-time/


自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数。今天就来简要介绍下如何利用dispatch_once创建单例。


在开发中我们会用到NSNotificationCenter、NSFileManager等,获取他们的实例通过[NSNotificationCenter defaultCenter]和[NSFileManager defaultManager]来获取,其实这就是单例。


我们先看下函数void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词第二个参数则是在整个应用程序中只会被调用一次的代码块dispach_once函数中的代码块只会被执行一次,而且还是线程安全的

接下来我们来实现自己的单例,这里有一个SchoolManager类,为这个类实现单例


+(SchoolManager *)sharedInstance
{
    static SchoolManager *sharedManager;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[SchoolManager alloc] init];
    });
    
    return sharedManager;
}

【yasi】不要忘记,这里的 dispatch_once_t onceToken 必须是 static 的!

到目前为止,我们就实现了一个单例,一切就搞定了,是不是很简单!

使用就按照如下方式获取唯一实例即可:

SchoolManager *schoolManager = [SchoolManager sharedInstance];
以上就简单介绍了使用dispatch_once函数实现单例的方法。

IOS多线程之dispatch_once剖析

在IOS开发中,为保证单例在整个程序运行中只被初始化一次,单线程的时候,通过静态变量可以实现;但是多线程的出现,使得在极端条件下,单例也可能返回了不同的对象。如在单例初始化完成前,多个进程同时访问单例...
  • mlibai
  • mlibai
  • 2015年07月18日 20:38
  • 2641

dispatch_once优化代码性能

有些变量只需要初始化一次(如从文件中读取配置参数,读取设备型号等等),可以使用dispatch_once来进行读取优化,保证只调用API一次,以后就只要直接访问变量即可 范例如下: sta...

dispatch_once的实现分析

dispatch_once的实现分析 dispatch_once可以保证代码被执行一次 +(NSDateFormatter*)getDBDateFormat { static NSDateFo...

Effective Objective-C 2.0: Item 45: Use dispatch_once for Thread-Safe Single-Time Code Execution

Item 45: Use dispatch_once for Thread-Safe Single-Time Code Execution The Singleton design pattern—...

GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

(1)GCD实现的同步异步、串行并行。 ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 [objc] view plain...

【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

dispatch_once 实现单例

无论是爱还是恨,你都需要单例。实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工...

(一二三)基于GCD的dispatch_once实现单例设计

要实现单例,关键是要保证类的alloc和init只被调用一次,并且被自身强引用防止释放。 近日读唐巧先生的《iOS开发进阶》,受益匪浅,通过GCD实现单例就是收获之一,下面把这个方法与大家分享。 在...

iOS开发-Objective-C单例在ARC环境下的实现和理解

objective-c语言arc环境下的单例到底应该怎么实现呢?为什么呢?如何保证使用alloc,init,new,copy,mutableCopy等方法实例化出来的对象,依然是那个单例对象呢?...

objective-C之宏定义实现单例设计模式

Singleton.h// 帮助实现单例设计模式 // .h文件的实现 #define SingletonH(methodName) + (instancetype)shared##methodNa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Objective-C] 用 dispatch_once 实现单例
举报原因:
原因补充:

(最多只允许输入30个字)