Setting a flag in compiler for NSLog not to show

后端 未结 7 1593
野趣味
野趣味 2021-01-21 18:55

Is there any particular flag which can be set to not display NSLog output in either debug or release?

Thanks.

7条回答
  •  佛祖请我去吃肉
    2021-01-21 19:30

    Default flag with a new Xcode project is DEBUG for Debug and none for Release. So you will hide NSLog in Release this way:

    #ifndef DEBUG
    #   define NSLog(...)
    #   define NSLogv(...)
    #endif
    

    Or if you want pretty custom logs as well (not using #ifdef here because no simple #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
    

    And if you want to override those macros and still log something sometimes, you can use:

    (NSLog)(@"This log is always visible!");
    

    Now, how to hide those as well? It would require you to #define NSLog NoLog and define NoLog as an extern function with an empty implementation like void NoLog(NSString *format, ...) {}. But it could be cleaner to avoid using (NSLog) altogether and instead use a function with a LogLevel enum:

    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);
    }
    

    The drawback of this CustomLog is that arguments get always evaluated, even in Release. So an optimal solution is multiple macros:

    #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
    

提交回复
热议问题