Objective c 打印字符串

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

在Objective-C中打印NSString的正确方法是什么?许多示例使用NSLog(),但根据文档:

NSLog是一个FoundationKit函数,用于将调试语句打印到控制台。 ... NSLog的工作原理基本上如下: fprintf(标准格式、格式字符串、参数…)

对我来说,这有点像Win32/C++中的_TRACE宏。我不想打印到stderr,我想打印到stdout。有人建议使用printf()如下:

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,只需打印新行即可。性能已经受到影响。