是否有任何特定的标志可以设置为在调试或释放时不显示NSLog输出?
感谢。
答案 0 :(得分:2)
在Xcode中,您可以为特定的构建配置定义宏。例如,这里我为Debug版本定义了DEBUG
,而没有为发布版本定义。
然后在代码中使用它,将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关于如何使变量“使用”的例子。