NSLog里面的变量参数功能

时间:2013-04-23 09:54:50

标签: iphone ios objective-c nslog variadic-functions

我对目标c变量参数函数一无所知。我想编写一个将采用nlsog类型参数的函数,但有时我会在该函数中使用NSLog。我怎样才能做到这一点?

-(void) printStatus:(NSString*)status, ...
{
    // I want use use NSLog with all these parameter here.

    // some gui logging also happens here
}

通话将是这样的,

[self printStatus:@"status"]; 

[self printStatus:@"Staus: %@", someObject];

我想使用printStatus,而不是使用NSLog。当我需要将控制台日志切换到GUI日志记录时,我只能更改为printStatus函数,而不是更改代码中的所有位置。

或者在我这里使用DLog,

#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#    define DLog(...) /* */
#endif

3 个答案:

答案 0 :(得分:7)

您需要使用C的varargs类型和NSLogv宏:

-(void)printStatus:(NSString*)status, ...
{
    va_list args;
    va_start(args, status);
    NSLogv(status, args);
    va_end(args);
}

这假设status参数是格式字符串,后跟参数。

如果要从格式字符串和参数(用于更新GUI)创建NSString,除了NSLogv之外,您还可以执行此操作:

NSLogv(status, args);
NSString *message = [[NSString alloc] initWithFormat:status arguments:args];
// ... log to GUI

答案 1 :(得分:1)

最后,对于感兴趣的人,这是我的最终版本的日志...

-(void) printStatus:(NSString*)status, ...
{
    va_list args;
    va_start(args, status);
    va_end(args);
    NSString * str = [[NSString alloc] initWithFormat:status arguments:args];
    DLog(@"%@", str);
    self.statusTextView.text = [_statusTextView.text stringByAppendingFormat:@"\n%@",str];
    [str release];
}

DLog在我的Prefix.pch文件中定义,

#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#    define DLog(...) /* */
#endif

答案 2 :(得分:-2)

我无法完全理解这个问题。据我所知,你可以使用格式化的字符串

    [NSString stringWithFormat:@"this is string %@",@"String"];