打印NSString

ta.*_*.is 28 objective-c

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

NSLog是一个FoundationKit函数,用于将调试语句打印到控制台.... NSLog的工作原理基本上如下:fprintf(stderr,format_string,args ...);

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

printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);
Run Code Online (Sandbox Code Playgroud)

但这似乎是间接的一个额外的水平,以打印NSString,它并没有"感觉"像解决方案.

bbu*_*bum 29

喷涌的东西stdout其实是一个相当罕见的事情在可可的事情,因为几乎所有的项目都在大自然GUI.作为命令行工具或需要处理的项目相对较少stdout.

但是,基金会确实提供了写入stdout的方法.具体来说,NSFileHandlefileHandleWithStandardOutput哪些让你可以写入文件句柄stdout.

从那里,它是一个转换NSStringNSData和写它的问题.

相当多的步骤,但很容易包含在一个可重用的功能:

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];
}
Run Code Online (Sandbox Code Playgroud)

  • NSNEXTSTEPStringEncoding? (2认同)

ken*_*ytm 25

那么这就是解决方案.

由于printf是纯C函数,因此无法识别Objective-C对象.(NSLog的格式化程序与printf的格式化程序不同.)因此,您必须在格式化之前将其转换为C字符串.

BTW你可以用[str UTF8String]而不是[str cStringUsingEncoding:NSUTF8StringEncoding].

  • 我理解`printf`是一个纯C函数,但我觉得很奇怪你必须使用它来打印NSString,而不是Core Foundation有一个文本IO库. (5认同)

小智 6

C 字符串(UTF8String)是指向字符串对象内部结构的指针。

NSString *str = @"Hello, World.";
printf("%s\n", [str UTF8String]);
Run Code Online (Sandbox Code Playgroud)