为什么某些方法中的参数列表以 结尾nil
?我特别在集合类中注意到了这一点,例如NSSet
:
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
和NSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
为什么某些方法中的参数列表以 结尾nil
?我特别在集合类中注意到了这一点,例如NSSet
:
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
和NSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
它与变量参数列表的工作方式有关(在参数中va_list
看到...
)。当代码试图提取列表中的所有值时,它需要知道何时停止(因为它不知道有多少)。我们用一个称为“哨兵”的特殊值来表示列表的末尾,通常是NULL
。这样,当处理代码在 中遇到 anil
时va_list
,它就知道它已经到了末尾。如果你忽略了nil
,你会得到奇怪的错误,因为代码将继续向下读取堆栈,将事物解释为对象,直到找到nil
.
这与 C 字符串必须以 -NULL
终止的原因非常相似。
附带说明一下,stringWithFormat:
和类似的printf
-style 方法不需要哨兵,因为它根据%
格式字符串中有多少修饰符来计算它需要多少参数。所以如果你给出一个格式字符串@"hello, %@"
,那么它只会寻找一个额外的参数,因为只有一个 % 修饰符。
Objective-C 中的可变参数函数除了提供一个参数外,没有办法确定参数列表何时结束nil
。