dispatch_once认识分析

dispatch_once认识分析

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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的逻辑

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117441.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 个人web服务器搭建教程_服务器是干嘛的

    个人web服务器搭建教程_服务器是干嘛的网上资料加自己整理========================一、Apache的配置(已经掌握)  Apache的核心配置文件是“Httpd.conf”,它在电脑中的位置为Apache的安装路径/Conf/,如果安装在C盘的根目录下,则该文件应该在“C:/Apache/Conf/”中,此外,打开Windows的“开始菜单”→“程序”→“ApacheHTTPServ

    2022年8月31日
    5
  • java中的关键字有哪些_java关键字有哪些?java关键字大全

    java中的关键字有哪些_java关键字有哪些?java关键字大全你知道java关键词都有哪些吗?下面小编就对于java关键词做了一次集合的大整理,下面就来和小编一起来了解一下,java的关键词吧!一、什么是java关键字?关键字是电脑语言里事先定义的,有特别意义的标识符。程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息。二、java关键字大全1、abstract-表明类或者成员方法具有抽象属性2、assert-断言,用来进行程序调试3、bool…

    2022年7月7日
    24
  • docker卸载命令_删除docker

    docker卸载命令_删除docker删除容器(jenkins官网提供的安装方式,删除比较特殊,因为jenkins自己创建了数据卷,所以要删除数据卷)不然,就算删除了容器,再运行镜像,以前的配置还是删不掉,运行的还是以前的配置首先,关停并删除jenkins容器dockerstop容器iddockerrm容器id然后,查看数据卷(如果是用挂载目录方式安装的jenkins的话,就不需要执行下面的步骤了)dockervolumels发现一个jenkins_home的数据卷,删除数据卷dockervolume

    2025年10月3日
    4
  • MYSQL 数据库导入导出命令

    MYSQL 数据库导入导出命令

    2021年9月24日
    43
  • PHP本地web服务器搭建教程(通俗易懂版)

    PHP本地web服务器搭建教程(通俗易懂版)PHP本地服务器搭建教程(通俗易懂)

    2022年7月17日
    15
  • 微信小程序实现下载功能(以下载视频为例)「建议收藏」

    微信小程序实现下载功能(以下载视频为例)「建议收藏」一、wx.downloadFile()方法:访问视频对应的Url,回调函数返回一个该视频文件的临时路径。wx.downloadFile({url:app.serverUrl+me.data.videoInfo.videoPath,success:function(res){//只要服务器有响应数据,就会把响应内容写入文件并进入success回调,业务需要自行判断是否下载到了想要的内容

    2022年6月22日
    313

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号