2010-08-15 3 views
21

Имеет ли NSLog() варианты, которые печатаются без маркировки времени и даты, и автоматической новой строки?Возможно ли использовать NSLog() без маркировки времени и даты и автоматической новой строки?

Спасибо. Теперь следующий код, я могу напечатать NSString, CString или объекты:

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSString *s = @"Hello, World!"; 
    NSDate *today = [NSDate date]; 

    NSLog(@"%@", s); 
    printf("%s at %s", [s UTF8String], [[today description] UTF8String]); 

    [pool drain]; 
    return 0; 
} 
+0

Использовать [** 'MLog.h on GitHub' **] (https://github.com/InderKumarRathore/MLog) –

ответ

19

Используйте printf() вместо NSLog()

+0

Поддерживает ли printf() NSString? –

+4

@ Stephen no, вам нужно будет использовать что-то вроде 'printf ("% s% s \ n ", [someString UTF8String], [[someObject description] UTF8String]);' – cobbal

+0

Нет, это функция C. Таким образом, вам придется преобразовать NSString в массив символов.Итак, 'printf ([myString cStringUsingEncoding: NSASCIIStringEncoding]);' – NebulaFox

14

Это тоже беспокоило меня, так что я написал функцию, чтобы заменить NSLog() и printf():

void IFPrint (NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 

    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], stdout); 

    va_end(args); 
} 

Затем вы можете использовать его вместо NSLog() (например, IFPrint(@"Current date: %@", [NSDate date])), но он не распечатает никаких временных меток или новой строки, и вам не нужно возиться с C s trings и массивов, и еще много чего. Я бы сказал, это очень удобно.

Если вы хотите, проверьте мой полный код (я также написал замену fprintf, scanf и fscanf) here.
(Там также есть тема об этом here).

2

Первое, что я делаю на любом проекте падение (мой сокращенный вариант) this class ... который избавляется от ВСЕХ АБСУРДА в NSLog ... Поместите это в верхней части .m файла - и консоль выход будет PERFECT.

#import <Foundation/Foundation.h> 
#import <stdio.h> 
#define MLogString(s,...) \ 
    [MLog logFile:__FILE__ lineNumber:__LINE__ \ 
     format:(s),##__VA_ARGS__] 
@interface MLog : NSObject { } 
+ (void) logFile: (char*) sourceFile lineNumber: (int) lineNumber format: (NSString*) format, ...; 
+ (void) setLogOn: (BOOL) logOn; 
@end 
#ifndef NDEBUG 
extern void _NSSetLogCStringFunction(void (*)(const char *string, unsigned length, BOOL withSyslogBanner)); 
static void PrintNSLogMessage(const char *string, unsigned length, BOOL withSyslogBanner){ puts(string); } 
static void HackNSLog(void) __attribute__((constructor)); 
static void HackNSLog(void){ _NSSetLogCStringFunction(PrintNSLogMessage); } 
#endif 
static BOOL __MLogOn = NO; 
@implementation MLog 
+ (void) initialize { char * env = getenv("MLogOn"); 
    if (strcmp(env == NULL ? "" : env, "NO") != 0) __MLogOn = YES; 
} 
+ (void) logFile: (char *) sourceFile lineNumber: (int) lineNumber format: (NSString *) format, ...; { 
    va_list ap; NSString *print, *file; 
    if (__MLogOn == NO) return; va_start(ap, format); 
    file = [[NSString alloc] initWithBytes: sourceFile     length:strlen(sourceFile) encoding: NSUTF8StringEncoding]; 
    print = [[NSString alloc] initWithFormat:format arguments: ap]; 
    va_end(ap); // NSLog handles synchronization issues 
    NSLog(@"%s: %d %@", [[file lastPathComponent] UTF8String], lineNumber, print); return; 
} 
+ (void) setLogOn: (BOOL) logOn { __MLogOn = logOn; } 
@end 
+1

Является ли этот AppStore безопасным? –

12

Этот код будет работать

#ifdef DEBUG 
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
#else 
    #define NSLog(...) {} 
#endif 
+1

-1 для использования stderr –

+0

Очень приятно. @marshaul, почему stderr плохо использовать? Я не знаю, где NSLog обычно пишет. –

+0

Это не «плохо», это просто не имеет смысла иметь отдельные потоки STDERR и STDOUT. Соглашение заключается в использовании STDOUT для «нормального» вывода и STDERR для «ненормального» вывода (ошибки и т. Д.). Поскольку пользователь может явно перенаправлять потоки (например, перенаправляя STDERR в/dev/null), нет смысла передавать все в STDERR. Выводится вывод консоли/терминала, а ошибки - ошибки. Точка всего, что STDOUT является (должен быть) нормальным/стандартным случаем. –

3

Мне нравится решение этой Итай в. Я просто изменил код, чтобы использовать CFShow в среде ARC.

void CFLog(NSString *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    CFShow((__bridge CFStringRef)[[NSString alloc] initWithFormat:format arguments:args]); 

    va_end(args); 
} 
2

Определение макроса

#if __has_feature(objc_arc) 
    #define DLog(format, ...) CFShow((__bridge CFStringRef)[NSString stringWithFormat:format, ## __VA_ARGS__]); 
#else 
    #define DLog(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]); 
#endif 

И использовать этот макрос в вас код как

NSLog(@"Content with time stamp"); 
DLog(@"Content without time stamp"); 

Вот выход из консоли

NSLog->2014-01-28 10:43:17.873 TestApp[452:60b] Content with time stamp
DLOG - >Content without time stamp


P.S.

Если кому-то нужны пользовательские журналы, которые дают вам больше информации, например, имя метода/номер строки и т. Д., Можно скачать с открытым исходным кодом MLog.h on GitHub.

+1

@Charles Спасибо, я как раз собирался это сделать. Я не могу поверить, что редактирование было одобрено. Я проголосовал за отказ от комментариев: «Тот факт, что это ссылка, делает это понятным. Это редактирование - это откровенная самореклама, которая не добавляет никакой ценности для ответа». –

+1

Успокойся, ребята, iOSDeveloperTips у вас хороший сайт, и вместо того, чтобы давать какие-либо комментарии или что-то еще, вы должны были связаться со мной, и я тоже помог бы вам. Но идея «DMCA» изменила мой взгляд, и теперь я улучшил свой ответ с точки зрения ARC. –

+0

Это не соответствует правильному написанию букв UTF8. Вместо этого он отображает их номер юникода (или что бы он ни называл), например '\ u006z'. –

Смежные вопросы