打印NSString

时间:2010-02-07 07:20:18

标签: 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]);

但这似乎是间接的一个额外级别,以打印NSString,并且它没有“感觉”像解决方案。

6 个答案:

答案 0 :(得分:29)

对于Cocoa而言,向stdout发送内容实际上是非常罕见的,因为几乎所有项目都是GUI。相对较少的项目是作为命令行工具构建的,或者需要处理stdout

但是,基金会确实提供了写入stdout的方法。具体来说,NSFileHandlefileHandleWithStandardOutput,它为您提供了一个可以写入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 );