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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis Cluster集群收缩主从节点详细教程

    Redis Cluster集群收缩主从节点详细教程RedisCluster集群收缩主从节点文章目录RedisCluster集群收缩主从节点1.Cluster集群收缩概念2.将6390主节点从集群中收缩2.1.计算需要分给每一个节点的槽位数2.2.分配1365个槽位给192.168.81.210的6380节点2.3.分配1365个槽位给192.168.81.220的6380节点2.4.分配1365个槽位给192.168.81.230的6380节点2.5.查看当前集群槽位分配3.验证数据迁移过程是否导致数据异常4.将下线的主节点从集群中删除4.1.删除节

    2025年6月30日
    4
  • pycharm界面颜色设置_Excel护眼色打印

    pycharm界面颜色设置_Excel护眼色打印首先打开菜单file下的setting设置:然后找到editor中的general3.然后点击图标最上面的saveas创建第二个默认设置:4.接下来再下面的对话框中找到defaulttext并将background和foreground对话框打勾:5.对background进行颜色设定:6.对foreground进行设计:7.最后点击最下面的apply和ok即…

    2022年8月26日
    10
  • arcgis二次开发动态追踪以及提高

    arcgis二次开发动态追踪以及提高 前几天呢,想做动态追踪,发现这篇文章(https://blog.csdn.net/anlidengshiwei/article/details/41545301)写的不错,功能实现了之后,感觉可以更好,所有就自己就试着写了一下,本人新手,还望大家多多包涵;第一种方法,小车点的行进路径该有鼠标动态获取; double[]arrx=newdouble[1000];…

    2022年7月23日
    15
  • c语言实现二叉树层序遍历

    c语言实现二叉树层序遍历 按层序遍历原则,应打印ABCDEFG,如何实现?1.使用队列,队列是先进先出,首先把A放进去,然后如果队列有元素,就出队A,然后把出队元素A的左右BC节点入队,然后B出队,把B的左右节点放进去(没有就继续出队C),C出队,把DE放进去,D出队,E出队,把FG放进去,然后出FG(因为FG左右节点没有数据,不用入队),循环条件是队列不能为空(才能实现出队操作)核心源码:voidLev…

    2022年5月11日
    43
  • 反射型XSS、存储型XSS及DOM型XSS到底有什么区别?????「建议收藏」

    反射型XSS、存储型XSS及DOM型XSS到底有什么区别?????「建议收藏」被攻击者是单一解析地方不同存储时间不同允许点的不同

    2022年5月3日
    52
  • CAD图纸转换成白色背景SVG格式如何设置其页面大小?

    CAD图纸转换成白色背景SVG格式如何设置其页面大小?

    2021年7月6日
    113

发表回复

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

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