6

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

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

NSArray

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

2 回答 2

13

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

这与 C 字符串必须以 -NULL终止的原因非常相似。

附带说明一下,stringWithFormat:和类似的printf-style 方法不需要哨兵,因为它根据%格式字符串中有多少修饰符来计算它需要多少参数。所以如果你给出一个格式字符串@"hello, %@",那么它只会寻找一个额外的参数,因为只有一个 % 修饰符。

于 2010-03-19T14:30:42.717 回答
4

Objective-C 中的可变参数函数除了提供一个参数外,没有办法确定参数列表何时结束nil

于 2010-03-19T14:31:45.987 回答