这已被问过,但我没有得到我的头。我有我自己的屏幕记录器,它有一个方法“追加”,它应该像NSLog一样工作,并带有多个参数。如何在NSLog等方法中处理多个参数?
因此,而不是写这个:
int mynum = 19;
NSLog(@"This is a number %d",mynum);
我想这样做:
[Logger append:@"This is a number %d",mynum];
任何想法我怎么能做到这一点?
感谢
这已被问过,但我没有得到我的头。我有我自己的屏幕记录器,它有一个方法“追加”,它应该像NSLog一样工作,并带有多个参数。如何在NSLog等方法中处理多个参数?
因此,而不是写这个:
int mynum = 19;
NSLog(@"This is a number %d",mynum);
我想这样做:
[Logger append:@"This is a number %d",mynum];
任何想法我怎么能做到这一点?
感谢
好的,这是困难的方法。 :-)
使用STDARG.H宏来创建你的附加参数的va_list副本,然后创建一个字符串,使用-initWithFormat:arguments:
方法:
-(void) append:(NSString*)format, ... {
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];
// Append logString to your logger
va_end(args_copy);
[logString release];
}
这种方式给你的所有灵活性NSLog()本身,支持任何数量和类型的参数。
[Logger append:[NSString stringWithFormat:@"This is a number %d",mynum]];
你想要一个省略号,例如
-(SomeResult*)append:(id)object,... {
id obj;
va_list argumentList;
va_start(argumentList, obj);
while (obj = va_arg(argumentList, id)) // Do something with obj
va_end(argumentList);
// ...
}
请注意,如果你只是想做像你说的那样的日志记录,说@Terente解决方案更好 – vickirk 2011-04-20 10:13:41
关闭,但不完全。 :-) Stdarg宏是这样做的方式,但您的示例仅支持对象参数,并且需要在参数列表末尾有一个零哨兵,而不是使用格式字符串。你也没有使用va_start()很对 - 它应该是'va_start(argumentList,object)'。 – 2011-04-20 12:28:48
@Sherm,好点,在我的辩护中,我只是提供了使用可变参数函数的介绍,当然不打算产生一些功能代码。 (虽然指出了这一点) – vickirk 2011-04-20 12:47:17
好吧,是的,这将是简单的方法;)但是,因为我在这个话题上,我真的很想尝试一下。 – eemceebee 2011-04-20 12:09:06