zoukankan      html  css  js  c++  java
  • 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的逻辑

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

  • 相关阅读:
    etcd:从应用场景到实现原理的全方位解读
    open-falcon编写的整个脑洞历程
    开源还是商用?十大云运维监控工具横评
    我的后端开发书架2015 2.0版
    【MDCC 2015】友盟数据平台负责人吴磊:移动大数据平台的架构与实践
    Effective Go
    Airbnb JavaScript Style Guide
    Google HTML/CSS Style Guide
    nservicebus教程-目录
    测试
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4673982.html
Copyright © 2011-2022 走看看