天天看點

dispatch_once的實作分析

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的邏輯了