3

我对目标 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];

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

或者像我在这里使用的那样使用 DLog,

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

3 回答 3

11

您需要使用 C 的可变参数类型和NSLogv宏:

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

这假定status参数是一个格式字符串,后跟它的参数。

如果您想NSString从格式字符串和参数创建一个(用于更新您的 GUI),您可以执行以下操作NSLogv

NSLogv(status, args);
NSString *message = [[NSString alloc] initWithFormat:status arguments:args];
// ... log to GUI
于 2013-04-23T10:01:24.920 回答
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
于 2013-04-23T10:57:02.707 回答
-2

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

    [NSString stringWithFormat:@"this is string %@",@"String"];
于 2013-04-23T09:59:14.833 回答