我想将一个变量参数列表从一个方法(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 *))) {
...
}
}
发布于 2013-04-22 07:06:32
发布于 2013-04-22 07:58:35
参见Technical Q&A QA1405: Variable arguments in Objective-C methods。
接受可变参数的
方法称为可变方法。
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
发布于 2014-06-19 17:27:55
我用于调试的解决方案如下所示
-(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上添加一个保护以确保不为空。
https://stackoverflow.com/questions/16141126
复制