dispatch_once

GCD之用dispatch_once创建单例

给你一囗甜甜゛ 提交于 2020-03-03 21:25:34
单例模式是开发者常用的一种设置模式,常见的实现方式为:在类中编写名为 sharedInstance的方法,该方法只会返回全类共用的单例实例,而不会在每次调用时创建新的实例. 常见的做法是: + (instancetype)sharedUser { static User *_sharedInstance = nil; @synchronized(self) { if (!_sharedInstance) { _sharedInstance = [[self alloc] init]; } } return _sharedInstance; } 为了保证线程安全,上面的代码把创建代理的代码包裹在同步块里. 相对于上面的实现方式,使用GCD的dispatch_once实现起来更为容易. 所用到的函数是: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // code to be executed once }); 此函数接受的类型为 dispatch_once_t的特殊函数 token,此外还接受块参数.对于给定的token来说,该函数保证相关的块必定会执行,且仅执行一次.首次调用该函数时必然会执行块中的代码, 最重要的是:次操作完全是线程安全的!!!需要注意的是:对于只需执行一次的块来说

dispatch_once创建单例

我们两清 提交于 2020-03-03 21:20:03
无论是爱还是恨,你都需要单例。实际上每个iOS或Mac OS应用都至少会有 UIApplication 或 NSApplication . 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。 或者我的理解是: 单例是一种类,该类只能实例化一个对象。 尽管这是单例的实际定义,但在Foundation框架中不一定是这样。比如 NSFileManger 和 NSNotificationCenter, 分别通过它们的类方法 defaultManager 和 defaultCenter 获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。在本文中我们也会采用该方法。 使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了 Grand Central Dispatch (GCD) (Mac OS 10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数。 该函数就是 dispatch_once : void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block); 该函数接收一个