爲什麼某些方法中的參數列表以nil
結尾?我曾特別是在集合類注意到了這一點,例如NSSet
:爲什麼某些Cocoa方法中的參數列表以零結束?
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
和NSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
爲什麼某些方法中的參數列表以nil
結尾?我曾特別是在集合類注意到了這一點,例如NSSet
:爲什麼某些Cocoa方法中的參數列表以零結束?
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
和NSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
它與參數列表如何變量的工作(va_list
,在參數視爲...
做)。當代碼嘗試提取列表中的所有值時,它需要知道何時停止(因爲它不知道有多少)。我們用名爲「哨兵」的特殊值表示列表的末尾,通常是NULL
。這樣,當處理代碼在va_list
中遇到nil
時,它知道它已到達最後。如果你遺漏了nil
,你會得到奇怪的錯誤,因爲代碼將繼續讀取堆棧,將事物解釋爲對象,直到找到nil
。
這與爲什麼C字符串必須是NULL
終止非常相似。
作爲一個側面說明,stringWithFormat:
和類似printf
式的方法並不需要一個哨兵,因爲它計算出它需要多少個參數,基於%
改性劑有多少格式字符串。所以如果你給出一個格式字符串@"hello, %@"
,那麼它只會尋找一個額外的參數,因爲只有一個%修飾符。
Objective-C中的變量函數沒有辦法確定參數列表何時結束,除了提供參數nil
。
或格式字符串。 (與C相同) – 2010-03-19 23:30:36
或明確的參數計數。 – 2010-07-10 14:09:46
+1,但我仍然認爲ascii-art BSG cylon會比NULL更冷,因爲哨兵 – slf 2010-03-19 14:32:49