1

大家好,我发现这段代码用于创建不同的 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
4

2 回答 2

1

添加这个:

#define NO_LOG 1

#import输入您上面显示的文件之前。

顺便说一句,一个更好的实现会定义PxDebug()NSLog()如果定义了就什么都没有NO_LOG......

于 2013-05-14T13:37:10.657 回答
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(@"你好 %d", 123);

[-[SomeViewController viewWillAppear:]:91] 你好 123

编辑:如果您将文件添加到projectname-Prefix.pch文件中,那么您可以使用它而不必在任何地方都包含它

并且它将自动从发布版本中删除,因为 DEBUG 在其处于调试模式时自动定义为项目定义

于 2013-05-14T13:44:34.933 回答