方法和可选参数

我在Apple文档中读到我们可以在Objective c方法调用中使用可选参数。 Apple文档中的示例:

采用可变数量参数的方法也是可能的,尽管它们有点罕见。 在方法名称结束后,使用逗号分隔额外参数。 (与冒号不同,逗号不被视为名称的一部分。)在下面的示例中,假想的makeGroup:方法传递一个必需参数(组)和三个可选参数:

[receiver makeGroup:group, memberOne, memberTwo, memberThree]; 

有人能说出何时使用此function以及如何使用? Apple API中有任何示例吗?

谢谢

您描述的方法类型称为可变方法。 Cocoa中的示例包括+[NSArray arrayWithObjects:]+[NSDictionary dictionaryWithObjectsAndKeys:] 。 您可以使用stdarg.h定义的宏来访问可变方法(或函数)的参数。

这是一个如何实现+[NSArray arrayWithObjects:]方法的示例:

 + (NSArray *)arrayWithObjects:(id)firstObject, ... { int count = 0; va_list ap; va_start(ap, firstObject); id object = firstObject; while (object) { ++count; object = va_arg(ap, id); } va_end(ap); id objects[count]; va_start(ap, firstObject); object = firstObject; for (int i = 0; i < count; ++i) { objects[i] = object; object = va_arg(ap, id); } va_end(ap); return [self arrayWithObjects:objects count:count]; } 

我写过一次或两次的方法。 这有点痛苦。 它的工作原理非常类似于在C程序中解析命令行。

我现在不记得我在哪里找到了如何做的文档。 如果我没记错的话,它使用函数va_start()和va_end()。

该方法的一个主要缺点是,逗号分隔的参数列表未经过类型检查,并且没有像普通方法那样的标签。

使用该方法的主要方法是在NSArray的arrayWithObjects之类的方法中,您需要允许任意类型的参数的可变大小列表,或NSLog。