dispatch_once的实现分析
来源:互联网 发布:linux 目录权限递归 编辑:程序博客网 时间:2024/06/08 06:31
dispatch_once可以保证代码被执行一次
+(NSDateFormatter*)getDBDateFormat{ static NSDateFormatter* format; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ format = [[LKDateFormatter alloc]init]; format.dateFormat = @"yyyy-MM-dd HH:mm:ss"; }); return format;}
dispatch_once_t的描述是typedef long dispatch_once_t;
Description A predicate for use with the dispatch_once function.
dispatch_once展开是
void_dispatch_once(dispatch_once_t *predicate, dispatch_block_t block){ if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) { dispatch_once(predicate, block); }}
~0l 是 long 的0 取反也就是 一大堆1
我们再展开DISPATCH_EXPECT, 是__builtin_expect((x), (v))
__builtin_expect是GCC(version>=2.9)引进的宏,其作用就是帮助编译器判断条件跳转的预期值,避免跳转造成时间乱费。并没有改变其对真值的判断。
所以呢dispatch_once可以看成
+(NSDateFormatter*)getDBDateFormat{ static NSDateFormatter* format; static long onceToken = 0; if (onceToken != 0){ 1... { format = [[LKDateFormatter alloc]init]; format.dateFormat = @"yyyy-MM-dd HH:mm:ss"; } 2... } return format;}
我们可以猜测在下面的2...里的代码是修改了 onceToken的值
输出查看一下,
+(NSDateFormatter *) dateFormatter{ static NSDateFormatter* format; static dispatch_once_t onceToken; NSLogD(@"%ld", onceToken); dispatch_once(&onceToken, ^{ NSLogD(@"%ld", onceToken); format = [[NSDateFormatter alloc] init]; format.dateFormat = @"yyyy-MM-dd HH:mm:ss"; }); NSLogD(@"%ld", onceToken); return format;}
结果是
0,
-1073755728,
-1
发现在1里改变了一次
然后在2里改成了-1
这样我们就不难理解dispatch_once的逻辑了
3 0
- dispatch_once的实现分析
- dispatch_once的实现分析
- dispatch_once实现分析
- dispatch_once造成的死锁----分析、解决与自动检测
- dispatch_once 实现单例
- dispatch_once 实现单例
- dispatch_once 实现单利
- dispatch_once 实现单例
- dispatch_once的使用
- dispatch_once 的简单应用
- dispatch_once
- dispatch_once
- dispatch_once
- dispatch_once
- dispatch_once
- dispatch_once
- 使用dispatch_once实现单例
- (一二三)基于GCD的dispatch_once实现单例设计
- Fedora 64 运行eclipse android
- qt4的移植
- cocos2dx 3.0 rc1 用c++11 thread 注意的地方
- HDOJ 4614 Vases and Flowers
- Clojure中partial函数的疑惑
- dispatch_once的实现分析
- OC语言自学《十》---- OC(构造函数、分类等知识总结)
- 动态优先权进程调度算法
- python 学习札记(2)
- 斐波那契数列
- Matlab实现BP神经网络
- windows字符类型
- 利用html5 canvas 画图的一个例子
- TIFF Tag JPEGInterchangeFormat