在编译器中为NSLog设置一个不显示的标志

时间:2012-11-02 16:15:00

标签: iphone objective-c ios ipad cocoa

是否有任何特定的标志可以设置为在调试或释放时不显示NSLog输出?

感谢。

7 个答案:

答案 0 :(得分:2)

在Xcode中,您可以为特定的构建配置定义宏。例如,这里我为Debug版本定义了DEBUG,而没有为发布版本定义。

DEBUG flag set for Debug Build Config in Xcode

然后在代码中使用它,将NSLog(...)语句包装起来(或者你选择使用宏,更新:darren的方法对这种技术非常好):< / p>

#ifdef DEBUG
    NSLog(...);
#endif

仅对发布配置逻辑使用相同的机制。

如果您有不同数量的构建配置,则可以使用此功能,如果要为不同的构建配置启用/禁用不同级别的功能,则可以定义多个宏。

答案 1 :(得分:2)

一个选项可能是使用宏作为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构建中,则日志记录宏将变为无操作。

答案 2 :(得分:2)

通常,人们编写自己的宏 - 比如DebugLog--让日志被“编译出来”:

#undef DebugLog
#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog( @"%@", [NSString stringWithFormat:(s), ##__VA_ARGS] )
#else
#define DebugLog( s, ... )
#endif

答案 3 :(得分:1)

新的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并将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

答案 4 :(得分:0)

使用此宏检查调试模式

#ifdef DEBUG
//NSLog(@"XYZ");
#endif

以上NSLog不会以发布模式打印

答案 5 :(得分:0)

您可以在预编译头(.pch)中定义一个宏来禁用NSLog:

#ifdef RELEASE
#   define NSLog(...)
#endif

这会在发布版本中禁用NSLog。

答案 6 :(得分:0)

添加此b / c没有任何答案似乎可以解决您可能遇到的警告(取决于项目设置)以及其中一些方法。

这是我能找到压制NSLog而不会收到任何警告的唯一方法。否则我会得到我们使用的设置(警告未使用的变量)。

#undef NSLog

#define NSLog(fmt, ...) if (0) { printf("%s", [[NSString stringWithFormat:fmt, ##__VA_ARGS__] UTF8String]); }

然后,您需要做的就是将其放在用于发布版本的任何pch文件中,或者放在要禁止日志的任何位置。

感谢@Hot Licks关于如何使变量“使用”的例子。