簡體   English   中英

在編譯器中為NSLog設置一個不顯示的標志

[英]Setting a flag in compiler for NSLog not to show

是否有任何特定的標志可以設置為在調試或釋放時不顯示NSLog輸出?

謝謝。

在Xcode中,您可以為特定的構建配置定義宏。 例如,這里我為Debug構建定義了DEBUG ,而沒有為發布構建定義。

在Xcode中為Debug Build Config設置了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM