2010-03-19 53 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

相关问题