2012-10-05 26 views
2

我已經看到了包裝NSLog的例子,但我不是100%確定的細節。NSLog的包裝

例如#define debugLog(fmt,...) NSLog(@"%@",[NSString stringWithFormat:(fmt), ##__VA_ARGS__]);

這裏的論點究竟是什麼?

如果我想要一個常量字符串添加到這樣的日誌作爲

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

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

我怎麼會在#define宏創建這個?

回答

4

debugLog是一個可變宏(需要可變數量的參數)。特定宏調用NSLog帶有2個參數,第一個是格式字符串(@"%@"),第二個是由stringWithFormat返回的自動釋放字符串,該字符串接受傳遞的格式字符串以及宏的可變參數。

__VA_ARGS__是引用宏內可變參數列表的方式。它對應於參數列表中的...

而不是你logMessage方法,你可以使用debugLog宏來達到相同的結果:

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

宏本身似乎有點毫無意義的,雖然,因爲它是唯一的包裝NSLog不添加任何東西。

如果你想直接對應logMessage宏,那麼你就不必在所有應對可變參數列表:

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

你必須要小心是否雙方的論點是NSString的,因爲宏是類型不安全的。

+0

謝謝,你能否建議如何將上面的logMessage方法寫入宏? – jarryd

+0

非常感謝。我是否在前綴文件中定義了這個? – jarryd

+0

您可以將其定義在任何您認爲符合邏輯的項目中。 –