为什么某些方法中的参数列表以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