Objective c 打印字符串
在Objective-C中打印NSString的正确方法是什么?许多示例使用NSLog(),但根据文档: NSLog是一个FoundationKit函数,用于将调试语句打印到控制台。 ... NSLog的工作原理基本上如下: fprintf(标准格式、格式字符串、参数…) 对我来说,这有点像Win32/C++中的_TRACE宏。我不想打印到stderr,我想打印到stdout。有人建议使用printf()如下:Objective c 打印字符串,objective-c,Objective C,在Objective-C中打印NSString的正确方法是什么?许多示例使用NSLog(),但根据文档: NSLog是一个FoundationKit函数,用于将调试语句打印到控制台。 ... NSLog的工作原理基本上如下: fprintf(标准格式、格式字符串、参数…) 对我来说,这有点像Win32/C++中的_TRACE宏。我不想打印到stderr,我想打印到stdout。有人建议使用printf()如下: printf("%s", [str cStringUsingEncoding:NSU
printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);
但是这看起来像是间接打印NSString的额外级别,它“感觉”不像解决方案。这就是解决方案
由于printf
是一个纯C函数,因此它无法识别Objective-C对象。(NSLog的格式化程序与printf的不同。)因此,在格式化之前必须将其转换为C字符串
顺便说一句,您可以使用
[str UTF8String]
而不是[str cStringUsingEncoding:NSUTF8StringEncoding]
您应该使用自定义文件处理程序或自己编写宏
提示:当NSLog打印出一个对象时,它使用对象的
debugDescription
方法。您可以为自定义的NSObject
子类重写此方法,以将自定义的debugInfo打印到stdout。在Cocoa中,向stdout
吐东西实际上是一件非常罕见的事情,因为几乎所有的项目本质上都是GUI。作为命令行工具构建或以其他方式需要处理stdout
的项目相对较少
但是,基金会确实提供了对STDUT进行写入的方法。具体来说,
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];
}
我想你会发现这些足以满足你的需要:
// 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
}
C字符串(UTF8String)是指向字符串对象内部结构的指针
NSString *str = @"Hello, World.";
printf("%s\n", [str UTF8String]);
我只是:
define NSPrintf(...) printf( "%s", [[NSString stringWithFormat: __VA_ARGS__] UTF8String] )
然后我可以将其用作:
NSPrintf( @"Sorry %@, I can't do that\n", name );
我理解<代码> Prtff<代码>是一个纯C函数,但我觉得奇怪的是,您必须使用它来打印NSCORM,而不是使用具有文本IO库的核心基础。肯定不知道。NSNEXTSTEPStringEncoding?很抱歉这么唠叨,但是如何在这样的日志行之间插入“\n”?不想在这样的日志记录工具中浪费太多的周期。啊,也许您知道为什么使用另一种方法(使用prinff(“%s\n”,[formattedString UTFString])向我的打印行中发出各种垃圾?可能是因为您正在将unicode字符串传递给需要ASCII字符串的对象。如果您使用printf,只需打印新行即可。性能已经受到影响。