dispatch_once可以保證代碼被執行一次
dispatch_once_t的描述是typedef long dispatch_once_t;
description a predicate for use with the dispatch_once function.
dispatch_once展開是
~0l 是 long 的0 取反也就是 一大堆1
我們再展開dispatch_expect, 是__builtin_expect((x), (v))
__builtin_expect是gcc(version>=2.9)引進的宏,其作用就是幫助編譯器判斷條件跳轉的預期值,避免跳轉造成時間亂費。并沒有改變其對真值的判斷。
是以呢dispatch_once可以看成
我們可以猜測在下面的2...裡的代碼是修改了 oncetoken的值
下斷點檢視一下,發現在1裡改變了一次
然後在2裡改成了-1
這樣我們就不難了解dispatch_once的邏輯了