2011-04-20 68 views
2

这已被问过,但我没有得到我的头。我有我自己的屏幕记录器,它有一个方法“追加”,它应该像NSLog一样工作,并带有多个参数。如何在NSLog等方法中处理多个参数?

因此,而不是写这个:

int mynum = 19; 
NSLog(@"This is a number %d",mynum); 

我想这样做:

[Logger append:@"This is a number %d",mynum]; 

任何想法我怎么能做到这一点?

感谢

回答

6

好的,这是困难的方法。 :-)

使用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()本身,支持任何数量和类型的参数。

0
[Logger append:[NSString stringWithFormat:@"This is a number %d",mynum]]; 
+1

好吧,是的,这将是简单的方法;)但是,因为我在这个话题上,我真的很想尝试一下。 – eemceebee 2011-04-20 12:09:06

2

你想要一个省略号,例如

-(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); 
    // ... 
} 
+0

请注意,如果你只是想做像你说的那样的日志记录,说@Terente解决方案更好 – vickirk 2011-04-20 10:13:41

+1

关闭,但不完全。 :-) Stdarg宏是这样做的方式,但您的示例仅支持对象参数,并且需要在参数列表末尾有一个零哨兵,而不是使用格式字符串。你也没有使用va_start()很对 - 它应该是'va_start(argumentList,object)'。 – 2011-04-20 12:28:48

+1

@Sherm,好点,在我的辩护中,我只是提供了使用可变参数函数的介绍,当然不打算产生一些功能代码。 (虽然指出了这一点) – vickirk 2011-04-20 12:47:17

相关问题