Objective c 为什么某些Cocoa方法中的参数列表以nil结尾?

Objective c 为什么某些Cocoa方法中的参数列表以nil结尾?,objective-c,cocoa,argument-passing,variadic-functions,Objective C,Cocoa,Argument Passing,Variadic Functions,为什么某些方法中的参数列表以nil结尾?我在集合类中特别注意到了这一点,例如NSSet: mySet = [NSSet setWithObjects:someData, aValue, aString, nil]; 和NSArray: NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil]; 它与变量参数列表的工作方式有关(va_list,在参数中被视为…)。当代码试图提取列表中的所

为什么某些方法中的参数列表以
nil
结尾?我在集合类中特别注意到了这一点,例如
NSSet

mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
NSArray

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];

它与变量参数列表的工作方式有关(
va_list
,在参数中被视为
)。当代码试图提取列表中的所有值时,它需要知道何时停止(因为它不知道有多少)。我们用一个称为“sentinel”的特殊值表示列表的末尾,该值通常为
NULL
。这样,当处理代码遇到
va_列表
中的
nil
时,它知道它已到达末尾。如果省略
nil
,您将得到奇怪的错误,因为代码将继续向下读取堆栈,将事物解释为对象,直到找到
nil

这与C字符串必须以
NULL
结尾的原因非常相似


作为旁注,
stringWithFormat:
和类似的
printf
样式的方法不需要哨兵,因为它根据格式字符串中的
%
修饰符的数量来计算需要多少参数。因此,如果您给出一个格式字符串
@“hello,%@”
,那么它将只查找一个额外的参数,因为只有一个%修饰符。

Objective-C中的变量函数除了提供一个
nil
参数外,无法确定参数列表何时结束。

+1,但我仍然认为,对于Sentinels或显式参数计数,ascii art BSG赛昂比NULL要酷得多。