2013-05-14 2 views
1

Привет, ребята, я нашел этот код, который используется для создания другого NSLog (без данных и временных меток), который отображает класс, в котором был создан журнал, и номер строки. Я читал, что можно отключить ведение журнала только для определенных классов с помощью NO_LOG, но не было объяснено, как использовать его в точности, я совершенно новый для obj-c, и я ценю объяснение того, как отключить ведение журнала для определенных классов и как активировать и деактивировать отладку. благодаряNSLog отключается от определенных классов и DEBUG

#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

Я переписал свой журнал некогда: [link] (https://github.com/pixelflut/PixLib -OpenSource/blob/master/PixLib% 20OpenSource/PxLogger.m), поскольку я предпочитаю более объектно-ориентированный подход. Это упрощает отключение регистрации в определенных файлах с помощью '[PxLogger setSilenceFiles: @ [" yourFileName "]]' –

ответ

1

Добавить это:

#define NO_LOG 1 

перед тем#import ИНГ файл, который я показал выше.

BTW лучше реализация будет определять PxDebug() и NSLog() ни к чему, если NO_LOG был определен ...

+0

'NO_LOG' предназначен для списка файлов, поэтому его использование будет # #define NO_LOG file1, file2' –

+0

@JonathanCichon Спасибо, я думаю, вы правы. Какая дерьмовая часть кода. – trojanfoe

+0

спасибо;), но он старый, и поэтому он работал с аргументами из comandline. –

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 автоматически определяется как определение проекта, когда он находится в режиме отладки.

+0

Не записывает имя класса и метода более полезно, чем запись в файл и номер строки? – trojanfoe

+0

Ну, как правило, ваши файлы называются такими же, как ваши классы, и если у вас есть номер строки, вы можете сказать, какой метод у него есть в – Fonix

+0

Можете ли вы? Я не могу, не глядя на исходный файл ... – trojanfoe