2011-07-01 49 views
51

我想在調試時啓用NSLog,否則禁用它。一個很簡單的一件事是:在調試模式下啓用和禁用NSLog

#ifdef DEBUG 
NSLog(@"My log"); 
#endif 

但是,所有這些#ifdef#endif是borring ... :(所以我嘗試其他的事情:(.PCH是把它的好地方)

#ifdef DEBUG 
# define NSLog(text) NSLog(text); 
#else 
# define NSLog(text) 
#endif 

這做工非常精細(不遞歸)。但問題是,NSLog的具有無限的論點。

void NSLog(NSString *format, ...) 

我如何解決這個問題在預處理模式下工作?

- 編輯 -

此代碼使您的NSLog更好:

#ifdef DEBUG 
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
#else 
    #define NSLog(...) 
#endif 
+0

對於尼斯問題+1。關於此主題的完整可重用組件http://mobile.tutsplus.com/tutorials/iphone/customize-nslog-for-easier-debugging/ –

+0

我遵循鏈接中的指南。但我得到了以下編譯錯誤:**體系結構x86_64的未定義符號: ld:找不到體系結構x86_64的符號(s) clang:錯誤:鏈接器命令失敗,退出代碼1(使用-v查看調用)**請幫忙@MahbuburRAaman – Gon

+0

@Gon,錯誤**架構x86_64的未定義符號:找不到架構x86_64 **的ld:symbol(s)出於以下原因。例如,對於缺少的庫或其他情況,請看下面的SO資源http://stackoverflow.com/questions/18408531/xcode-build-failure-undefined-symbols-for-architecture-x86-64,http: //stackoverflow.com/questions/6231368/objective-c-undefined-symbol-compilation-counting-symbols-for-architecture-x86-64-in-objective-c,錯誤。 –

回答

100

這應該做的伎倆:

#ifdef DEBUG 
# define NSLog(...) NSLog(__VA_ARGS__) 
#else 
# define NSLog(...) (void)0 
#endif 
+0

只有這個..普茨..謝謝! – Rodrigo

+1

這很好,但替換#define NSLog(...)NSLog(__VA_ARGS__);用#define NSLog(...)NSLog(__VA_ARGS__)(最後刪除;) –

+0

@JustSid:如何設置或重置DEBUG標誌? –

19

這是一個有點短,使用時也禁用的NSLog一個裝置。如果你正在編寫一個遊戲,經常發送可NSLogs你的FPS減少60至20

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR) 
    #define NSLog(...) 
#endif 
8

以上所有的答案是正確的。我可以建議你以下面的方式來做。假設我有一個if語句沒有括號

if(x==5) 
NSLog("x is 5"); 

如果它將替換NSLog沒有語句會發生什麼。所以我們可以簡單地用空循環替換它。

#ifdef DEBUG 
#define NSLog(...) NSLog(__VA_ARGS__) 
#else 
#define NSLog(...) do {} while (0) 
#endif 

該語句將運行一次空循環。這將安全地從您的所有實時代碼中刪除您的NSLog。

+3

好點,這也是一個很好的地方,重複使用'if'語句沒有括號可能是一個壞主意。 –

+11

該代碼將被預處理爲'if(x == 5);'這很好。 –

+0

這對三元運算符不起作用。 –

1
#ifndef Debug 
    #define Debug 1 
#endif 

#if Debug 
# define DebugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
#else 
# define DebugLog(...) 
#endif 

將Debug設置爲1以啓用日誌,將0設置爲禁用它。

+0

我可以在哪裏放置這段代碼? –

+0

您可以創建常量頭文件,並將代碼添加到它並訪問您只需要導入頭文件並使用DebugLog函數記錄您想要的變量.... – Prashant

1

這裏是一個很好的把戲...... 添加到任何.M

#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog 

更換任何

NSLog(@"????"); 

EXTRANSLog(@"????"); 

在這個例子中,我創建了一個NSUser鍵並將BOOL設置爲YES,使用某種形式的開關等將鍵更改爲NO或完全移除,如果喲你不想通過控制檯調試器查看EXTRANSLog。

我在排除故障時使用此功能,並且不希望出現所有過多日誌。 只有當SomeFancyKey == YES。

這是相同

#define NSLog if(1) NSLog 

其中1是YES顯示的NSLog,0是NO。

相關問題