在Objective-C中打印NSString的正确方法是什么?很多例子都使用NSLog(),但根据文档:
NSLog是一个FoundationKit函数,用于将调试语句打印到控制台。 ... NSLog的工作原理基本如下: fprintf(stderr,format_string,args ...);
对我来说有点像Win32 / C ++中的_TRACE宏。我不想打印到stderr,我想打印到stdout。有人建议使用printf()如下:
printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);
但这似乎是间接的一个额外级别,以打印NSString,并且它没有“感觉”像解决方案。
答案 0 :(得分:29)
对于Cocoa而言,向stdout
发送内容实际上是非常罕见的,因为几乎所有项目都是GUI。相对较少的项目是作为命令行工具构建的,或者需要处理stdout
。
但是,基金会确实提供了写入stdout的方法。具体来说,NSFileHandle
有fileHandleWithStandardOutput
,它为您提供了一个可以写入stdout
的文件句柄。
从那里开始,需要将NSString
转换为NSData
并进行编写。
相当多的步骤,但很容易包含在可重复使用的功能中:
void MyLog(NSString *format, ...) {
va_list args;
va_start(args, format);
NSString *formattedString = [[NSString alloc] initWithFormat: format
arguments: args];
va_end(args);
[[NSFileHandle fileHandleWithStandardOutput]
writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]];
[formattedString release];
}
答案 1 :(得分:24)
这个是的解决方案。
由于printf
是纯C函数,因此无法识别Objective-C对象。 (NSLog的格式化程序与printf的格式化程序不同。)因此,您必须在格式化之前将其转换为C字符串。
顺便说一下,您可以使用[str UTF8String]
代替[str cStringUsingEncoding:NSUTF8StringEncoding]
。
答案 2 :(得分:3)
您应该使用自定义文件处理程序或自己编写宏。
提示:当NSLog打印出一个对象时,它使用对象的debugDescription
方法。您可以为自定义NSObject
子类重写此方法,以将自定义debugInfo打印到stdout。
答案 3 :(得分:3)
我认为你会发现这些足以满足你的需求:
// print to stdout
static void NSPrint(NSString *format, ...) {
va_list args;
va_start(args, format);
NSString *string = [[NSString alloc] initWithFormat:format arguments:args];
va_end(args);
fprintf(stdout, "%s\n", [string UTF8String]);
#if !__has_feature(objc_arc)
[string release];
#endif
}
// print to stderr
static void NSPrintErr(NSString *format, ...) {
va_list args;
va_start(args, format);
NSString *string = [[NSString alloc] initWithFormat:format arguments:args];
va_end(args);
fprintf(stderr, "%s\n", [string UTF8String]);
#if !__has_feature(objc_arc)
[string release];
#endif
}
答案 4 :(得分:3)
C string(UTF8String)是指向字符串对象内部结构的指针。
NSString *str = @"Hello, World.";
printf("%s\n", [str UTF8String]);
答案 5 :(得分:0)
我只是这样做:
define NSPrintf(...) printf( "%s", [[NSString stringWithFormat: __VA_ARGS__] UTF8String] )
然后我可以用它作为:
NSPrintf( @"Sorry %@, I can't do that\n", name );