[英]Setting a flag in compiler for NSLog not to show
是否有任何特定的標志可以設置為在調試或釋放時不顯示NSLog輸出?
謝謝。
在Xcode中,您可以為特定的構建配置定義宏。 例如,這里我為Debug構建定義了DEBUG
,而沒有為發布構建定義。
然后在代碼中使用它,將您的NSLog(...)
語句包裝在其中(或者,但是您選擇使用宏, update :darren的方法對於這種技術來說是相當不錯的):
#ifdef DEBUG
NSLog(...);
#endif
對於僅發布配置邏輯使用相同的機制。
如果您有不同數量的構建配置,則可以使用此功能,如果要為不同的構建配置啟用/禁用不同級別的功能,則可以定義多個宏。
一種選擇可能是使用宏代替NSLog(如果此時您很容易更改)。 我喜歡這些家伙使用的前綴頭文件:
http://www.cimgf.com/2010/05/02/my-current-prefix-pch-file/
基本上,它們的日志記錄功能是:
#ifdef DEBUG
#define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#else
#define DLog(...) do { } while (0)
#endif
因此,如果您不在DEBUG構建中,則日志記錄宏將變為無操作。
通常,人們編寫自己的宏(類似於DebugLog),以便“編譯”日志:
#undef DebugLog
#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog( @"%@", [NSString stringWithFormat:(s), ##__VA_ARGS] )
#else
#define DebugLog( s, ... )
#endif
帶有新Xcode項目的默認標志為Debug(調試)為DEBUG
,而對於Release(發布)為無。 因此,您將以這種方式隱藏NSLog
:
#ifndef DEBUG
# define NSLog(...)
# define NSLogv(...)
#endif
或者,如果您還想要漂亮的自定義日志(此處不使用#ifdef
,因為沒有簡單的#elifdef
):
#if DEBUG
# define NSLog(format, ...) NSLog((@"%s " format), __PRETTY_FUNCTION__, ##__VA_ARGS__)
# define NSLogv(format, ...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [[NSString alloc] initWithFormat:format arguments:__VA_ARGS__])
#elif ADHOC
// default logs
#else// Release
# define NSLog(...)
# define NSLogv(...)
#endif
如果你想覆蓋這些宏並且有時仍然記錄某些東西,你可以使用:
(NSLog)(@"This log is always visible!");
現在,如何隱藏這些? 這將要求您#define NSLog NoLog
並將#define NSLog NoLog
定義為具有空實現的外部函數,例如void NoLog(NSString *format, ...) {}
。 但是避免完全使用(NSLog)
而是使用帶有LogLevel枚舉的函數可能會更干凈:
typedef NS_ENUM(NSUInteger, LogLevel) {
LogLevelRelease,
LogLevelAdHoc,
LogLevelDeveloper,
};
void CustomLog(LogLevel level, NSString *format, ...) {
#if !DEBUG
if (LogLevel == LogLevelDeveloper)
return;
#if !ADHOC
if (LogLevel == LogLevelAdHoc)
return;
#endif
#endif
va_list ap;
va_start (ap, format);
NSLogv(format, ap);
va_end (ap);
}
CustomLog的缺點在於,即使在Release中,也總是對參數進行求值。 因此,最佳解決方案是多個宏:
#define NSLog(format, ...) NSLog((@"%s " format), __PRETTY_FUNCTION__, ##__VA_ARGS__)
#if DEBUG
# define DebugLog(...) NSLog(__VA_ARGS__)
# define AdHocLog(...) NSLog(__VA_ARGS__)
# define ReleaseLog(...) NSLog(__VA_ARGS__)
#elif ADHOC
# define DebugLog(...)
# define AdHocLog(...) NSLog(__VA_ARGS__)
# define ReleaseLog(...) NSLog(__VA_ARGS__)
#else// Release
# define NSLogv(...)
# define DebugLog(...)
# define AdHocLog(...)
# define ReleaseLog(...) NSLog(__VA_ARGS__)
#endif
使用此宏檢查調試模式
#ifdef DEBUG
//NSLog(@"XYZ");
#endif
以上NSLog在發布模式下不會被打印
您可以在預編譯頭文件(.pch)中定義宏以禁用NSLog:
#ifdef RELEASE
# define NSLog(...)
#endif
這會在發布版本中禁用NSLog。
添加此b / c沒有任何答案似乎解決了您可能具有的警告(取決於項目設置)以及其中一些方法。
這是我能找到壓制NSLog而不會收到任何警告的唯一方法。 否則,我會得到大量使用的設置(警告未使用的變量)。
#undef NSLog
#define NSLog(fmt, ...) if (0) { printf("%s", [[NSString stringWithFormat:fmt, ##__VA_ARGS__] UTF8String]); }
然后,您需要做的就是將其放在用於發布版本的任何pch文件中,或者放在要禁止日志的位置。
感謝@Hot Licks提供了如何使變量“使用”的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.