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 :(得分: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
如果有人想要自定义日志,它会为您提供更多信息,如方法名称/行号等,可以下载开源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