带有输入数组的方法

时间:2011-02-04 02:12:11

标签: objective-c ios4

我想要一个方法,我可以像NSArray那样放置尽可能多的参数:

- (id)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;

然后我可以使用:

NSArray *array = [[NSArray alloc] initWithObjects:obj1, obj2, ob3, nil];

我可以添加尽可能多的对象,只要我在末尾添加'nil'告诉它我已经完成了。

我的问题是我怎么知道有多少论点,以及我如何一次一个地通过它们?

4 个答案:

答案 0 :(得分:22)

- (void)yourMethod:(id) firstObject, ...
{
  id eachObject;
  va_list argumentList;
  if (firstObject)
  {               
    // do something with firstObject. Remember, it is not part of the variable argument list
    [self addObject: firstObject];
    va_start(argumentList, firstObject);          // scan for arguments after firstObject.
    while (eachObject = va_arg(argumentList, id)) // get rest of the objects until nil is found
    {
      // do something with each object
    }
    va_end(argumentList);
  }
}

答案 1 :(得分:3)

我认为你所谈论的是实现一种可变方法。这应该有所帮助:Variable arguments in Objective-C methods

答案 2 :(得分:3)

我没有使用这些可变方法的经验(因为它们被称为),但是有一些Cocoa功能可以处理它。

来自Apple的技术Q& A QA1405(代码段):

- (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);
    }
}

http://developer.apple.com/library/mac/#qa/qa2005/qa1405.html

复制

答案 3 :(得分:0)

我会尝试这样做:http://www.numbergrinder.com/node/35

为方便起见,Apple在其库中提供访问权限。知道你有多少元素的方法是迭代列表直到你达到零。

但是,如果您想将可变数量的参数传递给您正在编写的某个方法,我建议您使用NSArray并遍历该数组。

希望这有帮助!