dispatch_once认识分析
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的逻辑
版权声明:本文博客原创文章,博客,未经同意,不得转载。
dispatch_once认识分析的更多相关文章
- iOS刨根问底-深入理解GCD
概述 做过iOS开发的同学相信对于GCD(Grand Central Dispatch)并不陌生,因为在平时多线程开发过程中GCD应该是使用最多的技术甚至它要比它的上层封装NSOperation还要常 ...
- iOS的异步绘制--YYAsyncLayer源码分析
iOS的异步渲染 最近看了YYAsyncLayer在这里总结一下.YYAsyncLayer是整个YYKit异步渲染的基础.整个项目的Github地址在这里.你可以先下载了一睹为快,也可以跟着我一步一步 ...
- WeexSDK源码分析(iOS)
0.从工作原理谈起 Weex 表面上是一个客户端技术,但实际上它串联起了从本地开发.云端部署到分发的整个链路.开发者首先可在本地像编写 web 页面一样编写一个 app 的界面,然后通过命令行工具将之 ...
- 经典iOS第三方库源码分析 - YYModel
YYModel介绍 YYModel是一个针对iOS/OSX平台的高性能的Model解析库,是属于YYKit的一个组件,创建是ibireme. 其实在YYModel出现之前,已经有非常多的Model解析 ...
- ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)
前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...
- ios开发系列之内存泄漏分析(下)
接上篇,本篇主要讲解通知和 KVO 不移除观察者.block 循环引用 .NSThread 和 RunLoop一起使用造成的内存泄漏. 1.通知造成的内存泄漏 1.1.ios9 以后,一般的通知,都不 ...
- IOS 单例崩溃分析 2014-12-10 15:46:36
单例模式是常用的模式,但是在单例应用中偶或引发崩溃让人匪夷所思.其实真的是单例引起的吗?未必.但是现象都指向了是单例引起的.今天我亲身经历了看似崩溃在单例上的一个例子,但实则不是,今天做个记录用于今后 ...
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
随机推荐
- ios UITableView 相关
1.tableView 实现的方法 无分组的cell #pragma mark - Table view data source - (NSInteger)tableView:(UITableView ...
- 获取不同机型外置SD卡路径
/** * 运行挂载命令.返回挂载的地址.然后将地址解析 */ private void getExtSDCardPath() { try { Runtime runtime = Runtime.ge ...
- 可删除超炫&多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! 实例Demo下载地址在本文最后 简介 这个Demo主要是使用了cardsui ...
- 利用Javamail接收QQ邮箱和Gmail邮箱(转)
求大神解答 Java代码: public class SendMailController { //@Autowired private JavaMailSenderImpl mailSender; ...
- win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。
WIN7凭据管理器,如果你用一个帐号远程登录以后在电脑中会记住这个信息,假如你想用另外的帐号,那么就到控制面板-凭据管理器里中进行修改或者删除. 如果你登录以后提示,“无法访问.不允许一个用户使用一个 ...
- 怎样在万网加入Lync Online SRV记录
万网已经支持SRV记录解析了,可是有好几个朋友问我怎么加入SRV记录(假设域名提供商不支持,能够通过DNSPOD来实现),过程例如以下 1:绑定域名至Office 365 略,请查看我的视频或者博客中 ...
- java它们的定义ArrayList序列, 大神跳跃
一个list有两种类型的对象,今天有需求必须责令不同的约会对象,这里是代码 /** *@author xh1991101@163.com */ List<Message> messages ...
- Oracle Data Provider for .NET 的使用经验
原文:Oracle Data Provider for .NET 的使用经验 Oracle Data Provider for .NET 是Oracle提供的基于Ado.net接口的一个开发包. ...
- 广域网佰腾玩O2O笑话——它看起来很漂亮,注定不低于
据说 2014.8.29:中国最大的商业运营商万达在一起的互联网服务供应商百度.腾讯在深圳(属性)战略合作签约仪式举行. 从功能表面上.万达代表实体,百度代表数据.腾讯代表社区:按三个合伙人理解,是要 ...
- swift 学习资源 大集合
今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...