是否有任何特定标志可以设置为在调试或发布时不显示 NSLog 输出?
谢谢。
在 Xcode 中,您可以为特定的构建配置定义宏。例如,这里我DEBUG
为 Debug 构建定义了,而没有为 release 构建定义。
然后在代码中使用它,将您的NSLog(...)
语句包装在(或者无论您选择使用宏,更新: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
在 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
使用此宏检查调试模式
#ifdef DEBUG
//NSLog(@"XYZ");
#endif
以上 NSLog 将不会在 Release 模式下打印
您可以在预编译头文件 (.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 提供了如何使变量“使用”的示例。