2

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

谢谢。

4

7 回答 7

2

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

在 Xcode 中为 Debug Build Config 设置的 DEBUG 标志

然后在代码中使用它,将您的NSLog(...)语句包装在(或者无论您选择使用宏,更新:darren 的方法非常适合这种技术):

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

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

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

于 2012-11-02T16:21:15.900 回答
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 构建中,则日志记录宏将变为无操作。

于 2012-11-02T16:22:20.483 回答
2

通常,人们编写自己的宏(例如 DebugLog)来“编译”日志:

#undef DebugLog
#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog( @"%@", [NSString stringWithFormat:(s), ##__VA_ARGS] )
#else
#define DebugLog( s, ... )
#endif
于 2012-11-02T16:25:48.653 回答
1

新 Xcode 项目的默认标志是DEBUGDebug 而不是 Release。因此,您将以这种方式隐藏NSLog在 Release 中:

#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
于 2014-03-22T15:21:06.973 回答
0

使用此宏检查调试模式

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

以上 NSLog 将不会在 Release 模式下打印

于 2012-11-02T16:20:35.550 回答
0

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

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

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

于 2012-11-02T16:20:40.323 回答
0

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

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

#undef NSLog

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

然后你需要做的就是把它放在你用于发布版本的任何 pch 文件中,或者放在你想抑制日志的任何地方。

感谢@Hot Licks 提供了如何使变量“使用”的示例。

于 2013-07-13T09:02:58.003 回答