NSLog包装器

时间:2012-10-05 15:08:47

标签: objective-c macros nslog

我已经看过有关包装NSLog的示例,但我对这些细节并不是100%肯定。

e.g。 #define debugLog(fmt,...) NSLog(@"%@",[NSString stringWithFormat:(fmt), ##__VA_ARGS__]);

这里的论点究竟是什么?

如果我想将常量字符串添加到日志中,例如

- (void) logMessage:(NSString *) message ofType:(NSString *) type
{

    NSLog(@"%@ - %@", type, message);
}

我如何在#define宏中创建它?

1 个答案:

答案 0 :(得分:4)

debugLog是一个可变参数宏(采用可变数量的参数)。特定的宏使用2个参数调用NSLog,第一个是格式字符串(@"%@"),第二个是stringWithFormat返回的自动释放字符串,它接受传递的格式字符串和可变参数宏的论据。

__VA_ARGS__是引用宏中的变量参数列表的方法。它对应于参数列表中的...

您可以使用logMessage宏来实现相同的结果,而不是debugLog方法:

debugLog("%@ - %@", type, message);

宏本身似乎有点无意义,因为它只包装NSLog而不添加任何其他内容。

如果您想要一个直接对应logMessage的宏,那么您根本不需要处理可变参数列表:

#define logMessageAsMacro(message, type) NSLog(@"%@ - %@", message, type)

你必须要小心两个参数是否都是NSString,因为宏是类型不安全的。