【问题标题】:Is there any benefits at all to use dispatch_once pattern with primitives?将 dispatch_once 模式与原语一起使用有什么好处吗?
【发布时间】:2013-01-22 13:31:18
【问题描述】:

哪个更好?

static unsigned unitFlags;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
});

OR 和写作一样高效

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;

或者还有其他更有效的模式吗? 'unitFlags' 的定义会更好吗?

【问题讨论】:

    标签: ios objective-c dispatch


    【解决方案1】:

    你应该这样做:

    static unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
    

    如果右边的表达式不是有效的编译时常量,您只需要执行dispatch_once 技巧。但这是一个有效的编译时常量,因此您不必费力。

    static 表达式通常比#define 更好(它是键入的,对于一些复杂的表达式,它可能更有效)。在我看来,坚持使用static

    【讨论】:

    • 好的。因此,如果我理解正确:位的结果仅在编译时计算一次?还是第一次在运行时?反正只有一次?
    • @hfossli 是的,编译时并且只有一次。如果表达式足够复杂以至于无法在编译时完成,你会得到一个编译器错误告诉你。
    • 太棒了!即使它是内联在一个函数中?
    • 试试吧。编译器会告诉你它是否可以将其作为编译时static 赋值来处理。
    猜你喜欢
    • 2020-11-05
    • 2012-03-16
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多