3

我想将变量参数列表从一种方法(functionOne)传递给另一种方法(functionTwo)。一切正常,除了我无法弄清楚如何在 functionTwo 中设置 va_list,以便我可以访问 va_list 中的第一个参数。使用 va_arg 前进到 va_list 中的第二个参数。谢谢。

- (void)functionOne:(NSString *)configFiles, ... {
    va_list args;
    va_start(args, configFiles);
    [self functionTwo:args];
    va_end(args);
}

- (void)functionTwo:(va_list)files {
    NSString *file;
    while ((file = va_arg(configFiles, NSString *))) {
        ...
    }
}
4

3 回答 3

3

第一个可变参数不是传递给的参数va_start——它是紧随其后的参数。如果您想functionTwo:访问该configFiles字符串,则需要显式传递它。

于 2013-04-22T07:06:32.467 回答
2

请参阅技术问答 QA1405:Objective-C 方法中的变量参数

采用可变参数的方法称为可变参数方法。

请记住,Objective-C 方法的实现只是一段代码,就像 C 函数一样。stdarg(3) 手册页中描述的可变参数宏在方法中的工作方式与在普通函数中的工作方式相同。

这是一个 Objective-C 类别的示例,其中包含一个可变参数方法,该方法将 nil 终止的参数列表中的所有对象附加到 NSMutableArray 实例:

#import <Cocoa/Cocoa.h>

@interface NSMutableArray (variadicMethodExample)

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

@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];
      // Start scanning for arguments after firstObject.
      va_start(argumentList, 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
于 2013-04-22T07:58:34.927 回答
2

我用于调试目的的解决方案就像

-(void) debug:(NSString*)format, ... {

    if (level < MXMLogLevelDebug) return;

    if(format == nil) return;

    va_list args, args_copy;
    va_start(args, format);
    va_copy(args_copy, args);
    va_end(args);

    NSString *logString = [[NSString alloc] initWithFormat:format
                                                  arguments:args_copy];

    NSString *funcCaller = @"";
    NSArray *syms = [NSThread  callStackSymbols];
    if ([syms count] > 1) {
        funcCaller = [syms objectAtIndex:1];
    }
    NSString *logMessage = [NSString stringWithFormat:@"%@ DEBUG: %@", funcCaller, logString];

    NSLog(@"%@",logMessage);


}

这可能产生的副作用是您必须在 args 上添加一个保护以确保它不为 NULL。

于 2014-06-19T17:27:55.123 回答