(一二三)基于GCD的dispatch_once实现单例设计
来源:互联网 发布:淘宝开店 旺旺名字 编辑:程序博客网 时间:2024/05/17 02:32
要实现单例,关键是要保证类的alloc和init只被调用一次,并且被自身强引用防止释放。
近日读唐巧先生的《iOS开发进阶》,受益匪浅,通过GCD实现单例就是收获之一,下面把这个方法与大家分享。
在GCD中,有一个函数dispatch_once,可以实现代码段的一次性执行,和static修饰的变量赋值的一次性一样,我们结合static和dispatch_once,就可以简单的实现单例。
下面的代码实现了SomeClass单例:
#import <Foundation/Foundation.h>@interface SomeClass : NSObject+ (SomeClass *)sharedInstance;@end
#import "SomeClass.h"@implementation SomeClass+ (SomeClass *)sharedInstance{ static id sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }@end下面解释一下这段代码。
第一句新建一个sharedInstance静态强指针,是为了指向创建好的单例,防止其释放,只有第一次进入的时候指针被赋值为nil。
一定注意dispatch_once_t变量必须是静态,它的值用于判断是否已经执行一次。
第二句和dispatch_once是固定用法,这样可以实现block内的代码一次性执行,也就是说只有第一次调用这个方法时才会实例化类,之后都是返回指针指向的值。
最后返回指针,就相当于拿到了单例。
对单例的运行结果进行验证:
我们多次获取单例对象并且打印地址,可以发现地址是一样的。
#import "ViewController.h"#import "SomeClass.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; SomeClass *sc1 = [SomeClass sharedInstance]; SomeClass *sc2 = [SomeClass sharedInstance]; SomeClass *sc3 = [SomeClass sharedInstance]; NSLog(@"%p %p %p",sc1,sc2,sc3); }@end
2015-08-17 20:59:22.139 基于GCD实现单例[2785:31918] 0x7fb40af11b90 0x7fb40af11b90 0x7fb40af11b90
通过这种方式,简单高效的实现了单例,值得使用。
0 0
- (一二三)基于GCD的dispatch_once实现单例设计
- 单例(GCD:dispatch_once)
- GCD---dispatch_once实现单例模式
- 使用GCD的dispatch_once创建单例
- 使用GCD的dispatch_once创建单例
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- dispatch_once 实现单例
- dispatch_once 实现单例
- dispatch_once 实现单例
- iOS中使用GCD的dispatch_once创建单例
- 用 GCD dispatch_once创建单例方法
- 使用GCD中dispatch_once创建单例
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- 使用dispatch_once实现单例
- 单例模式一二三
- 在Objective C中使用GCD的dispatch_once创建单例
- 使用dispatch_once实现单例模式
- [Objective-C] 用 dispatch_once 实现单例
- DOS命令初接触
- POJ 3687 Labeling Balls (反向拓扑排序)
- 剑指offer_面试题26_复杂链表的复制
- 使用C++ 11 实现阻塞队列
- windows 消息机制的概述
- (一二三)基于GCD的dispatch_once实现单例设计
- 百股经项目部分知识点
- 关于C的未定义行为
- HDU 5386
- 操作系统的启动过程分析(以Linux系统为例)
- 黑马程序员-[OC语言] 第八篇:foundation框架之 NSFileManager、NSDate概述
- 音乐播放器--观察者模式+单例
- Activity的进入,退出动画设置
- IOS 设置TableViewCell背景透明