我用的是這樣的:
#ifdef YOUR_DEBUG_ENABLER_SYMBOL_ONLY_SET_IN_DEBUG_BUILDS
#define DEBUG_ONLY(_code_) _code_
#else
#define DEBUG_ONLY(_code_)
#endif
#define DebugLog(_str, ...) DEBUG_ONLY(NSLog(@"%s: " _str, __func__, ## __VA_ARGS__))
請注意,NSLog中的_str之前沒有逗號 - 這意味着您在調用代碼中使用的字符串被追加(由編譯器)到「%s:」字符串,以成爲複合格式字符串NSLog的。無論您想要打印的參數都可以包含在傳入的格式字符串中。 %s的適用於_ _ FUNC _和你_STR適用於變量中傳遞的休息:
float f;
int i;
NSString* s;
// Initialise f, i, and s to something
...
// Log the values only when in debug mode, with function name auto-prepended
DebugLog(@"float is: %f - int is: %d - string is: %@", f, i, s);
這樣做,你可以登錄你想要的任何文字和變量,有條件地對調試的優勢,並將函數名稱自動添加到輸出中。
爲了簡單起見,我把它留在了上面,但實際上我有不同的日誌級別(DebugLog0,DbugLog1等),因此您可以根據需要設置所需的日誌級別並獲取更多/更少的日誌記錄。這可以通過兩種方式完成:編譯時設置的日誌級別;或者在運行時設置日誌級別。您可以輕鬆地在此添加/展開。擁有DebugAssert,DebugWarn,ReleaseLog和ReleaseError宏也是有意義的。 – jhabbott 2010-10-03 16:44:29