2010-03-19 66 views

回答

13

它與參數列表如何變量的工作(va_list,在參數視爲...做)。當代碼嘗試提取列表中的所有值時,它需要知道何時停止(因爲它不知道有多少)。我們用名爲「哨兵」的特殊值表示列表的末尾,通常是NULL。這樣,當處理代碼在va_list中遇到nil時,它知道它已到達最後。如果你遺漏了nil,你會得到奇怪的錯誤,因爲代碼將繼續讀取堆棧,將事物解釋爲對象,直到找到nil

這與爲什麼C字符串必須是NULL終止非常相似。

作爲一個側面說明,stringWithFormat:和類似printf式的方法並不需要一個哨兵,因爲它計算出它需要多少個參數,基於%改性劑有多少格式字符串。所以如果你給出一個格式字符串@"hello, %@",那麼它只會尋找一個額外的參數,因爲只有一個%修飾符。

+6

+1,但我仍然認爲ascii-art BSG cylon會比NULL更冷,因爲哨兵 – slf 2010-03-19 14:32:49

3

Objective-C中的變量函數沒有辦法確定參數列表何時結束,除了提供參數nil

+1

或格式字符串。 (與C相同) – 2010-03-19 23:30:36

+1

或明確的參數計數。 – 2010-07-10 14:09:46

相關問題