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