Objective-C 中的可变参数

苹果官方文档 尝试翻译一下.

Q:我怎样才能写一个像NSString's +stringWithFormat:这样能够携带不定长参数的方法呢?
像这样携带不定长参数的方法称为可变参数函数.

请记住,Objective-C方法的实现仅仅是一个代码块,像一个C函数.在stdarg(3)标头档定义了提供可变参数函数使用的宏.在一个函数中,以相同的方式执行,就像他们在普通的方法中一样.

这是一个Objective-C category 的例子,包含一个可变参数函数,将所有的对象放在一个以nil结尾的参数列表的NSMutableArray的实例.

Listing 1: 一个典型的可变参数函数

#import <Cocoa/Cocoa.h>

@interface NSMutableArray (variadicMethodExample)

- (void) appendObjects:(id) firstObject, ...; // This method takes a nil-terminated list of objects.

@end

@implementation NSMutableArray (variadicMethodExample)

- (void) appendObjects:(id) firstObject, ...
{
id eachObject;
va_list argumentList;
if (firstObject) // The first argument isn't part of the varargs list,
  {                                   // so we'll handle it separately.
  [self addObject: firstObject];
  va_start(argumentList, firstObject); // Start scanning for arguments after firstObject.
  while (eachObject = va_arg(argumentList, id)) // As many times as we can get an argument of type "id"
      [self addObject: eachObject]; // that isn't nil, add it to self's contents.
  va_end(argumentList);
  }
}

@end
点赞