大家好我发现这段代码用于创建不同的NSLog(没有数据和时间戳),显示日志所在的类和行号。 我已经阅读过可以仅使用NO_LOG禁用某些类的日志记录,但是没有解释如何正确使用它,我对obj-c很新,我很欣赏如何禁用某些类的日志记录以及如何激活和停用调试。感谢
#define MAKESTRING(__VA_ARGS__) #__VA_ARGS__
#define TOSTRING(...) MAKESTRING(__VA_ARGS__)
static inline void PxReportv(BOOL doLog, char const *file, int line, NSString *prefix, NSString *fmt, va_list argList) {
if (doLog) {
NSString *fileNameWithExtension = [[NSString stringWithFormat:@"%s", file] lastPathComponent];
#ifdef NO_LOG
NSString *fileName = [fileNameWithExtension stringByDeletingPathExtension];
char *f = TOSTRING(NO_LOG);
NSArray *comps = [[[NSString alloc] initWithFormat:@"%s", f] componentsSeparatedByString:@","];
for (NSString *except in comps) {
if ([except isEqualToString:fileName]) {
return;
}
}
#endif
vprintf([[[NSString alloc] initWithFormat:[[NSString alloc] initWithFormat:@"%@ <%@ [%d]> %@\n", prefix, fileNameWithExtension, line, fmt] arguments:argList] cStringUsingEncoding:NSUTF8StringEncoding], NULL);
}
}
static inline void PxReport(BOOL doLog, char const *file, int line, NSString *prefix, NSString *fmt, ...) {
va_list ap;
va_start(ap, fmt);
PxReportv(doLog, file, line, prefix, fmt, ap);
va_end(ap);
}
#define PxError(...) PxReport(YES, __FILE__, __LINE__, @"[ERROR]", __VA_ARGS__)
#ifdef DEBUG
#define PxDebug(...) PxReport(YES, __FILE__, __LINE__, @"[DEBUG]", __VA_ARGS__)
#define NSLog(...) PxReport(YES, __FILE__, __LINE__, @"", __VA_ARGS__)
#else
#define PxDebug(...)
#define NSLog(...)
#endif
答案 0 :(得分:1)
添加:
#define NO_LOG 1
之前 #import
上面显示的文件。
顺便说一句,如果定义了PxDebug()
,更好的实现会将NSLog()
和NO_LOG
定义为空......
答案 1 :(得分:1)
这是一个非常冗长的解决方案,我做了一个比那个更整洁的解决方案
#ifndef DebugLog_h
#define DebugLog_h
#if DEBUG
#define DLog(...) do{\
printf("[%s:%d]", __FUNCTION__, __LINE__);\
NSString *_S_ = [NSString stringWithFormat:__VA_ARGS__];\
printf(" %s\n",[_S_ cStringUsingEncoding:NSUTF8StringEncoding]);\
}while(0);
#else
#define DLog(...)
#endif
#endif
将打印来自
的行号,类和函数例如:
Dlog(@“hello%d”,123);
[ - [SomeViewController viewWillAppear:]:91] hello 123
编辑:如果您将文件添加到projectname-Prefix.pch
文件,那么您可以使用它而无需将其包含在任何地方
它将自动从版本构建中删除,因为DEBUG在调试模式下自动定义为项目定义