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

Ric*_*idt 6 cocoa objective-c variadic-functions argument-passing

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

mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
Run Code Online (Sandbox Code Playgroud)

并且NSArray:

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
Run Code Online (Sandbox Code Playgroud)

Dav*_*ong 13

它与变量参数列表的工作方式有关(va_list参见...参数).当代码试图提取列表中的所有值时,它需要知道何时停止(因为它不知道有多少值).我们用一个称为"sentinel"的特殊值来表示列表的结尾,这通常是NULL.这样一来,当处理代码遇到一个nilva_list,它知道它的到达终点.如果你遗漏了nil,你会得到奇怪的错误,因为代码将继续读取堆栈,将事物解释为对象,直到找到nil.

这与C字符串必须被NULL终止的原因非常相似.

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

  • +1,但我仍然认为ascii-art BSG cylon对于哨兵来说会比NULL更酷 (6认同)