NSLog()是否可以没有时间戳和日期戳以及自动换行符?

时间:2010-08-15 11:48:08

标签: objective-c

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;
}  

6 个答案:

答案 0 :(得分:19)

使用printf()代替NSLog()

答案 1 :(得分: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语言字符串和数组,等等。我会说,它非常方便。

如果需要,请查看我的完整代码(我还写了fprintf,scanf和fscanf的替代品)here
(还有一个关于它的SO主题here)。

答案 2 :(得分:13)

此代码可以使用

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

答案 3 :(得分:3)

我喜欢Itai的解决方案。我刚刚修改了代码以在ARC环境下使用CFShow。

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

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

    va_end(args);
}

答案 4 :(得分:3)

定义宏

#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-&GT; 2014-01-28 10:43:17.873 TestApp[452:60b] Content with time stamp
DLog - &gt; Content without time stamp


P.S。

如果有人想要自定义日志,它会为您提供更多信息,如方法名称/行号等,可以下载开源MLog.h on GitHub

答案 5 :(得分:2)

我在任何项目上做的第一件事就是放入(我的精简版)this class ...它摆脱了NSLog中的所有非正式 ...这位于.m文件的顶部 - 您的控制台输出将完美

#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