2010-02-07 84 views
27

在Objective-C中打印NSString的正確方法是什麼?許多示例使用NSLog(),但根據文檔:打印NSString

NSLog是一個將調試語句打印到控制檯的FoundationKit函數。 ... NSLog基本上像這樣: fprintf(stderr,format_string,args ...);

這對我來說有點像Win32/C++中的_TRACE宏。我不想打印stderr,我想打印到stdout。還有誰建議使用printf的人()如下:

printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]); 

但是,這似乎是在間接的額外水平得到NSString的印刷,它不「感覺」之類的解決方案。

回答

24

那麼這個的解決方案。

由於printf是一個純C函數,它不會識別Objective-C對象。 (NSLog的格式化程序與printf的不同。)因此,在格式化之前必須將其轉換爲C字符串。

順便說一句,您可以使用[str UTF8String]而不是[str cStringUsingEncoding:NSUTF8StringEncoding]

+5

我明白'printf'是一個純粹的C函數,但我覺得很奇怪,你有用它來打印一個NSString,而不是具有文本IO庫的Core Foundation。 – 2010-02-07 08:29:19

3

您應該使用自定義文件處理程序或自己編寫宏。

提示:當NSLog輸出一個對象時,它使用對象的debugDescription方法。您可以爲您的自定義NSObject子類重寫此方法以將自定義debugInfo打印到標準輸出。

+0

太棒了!當然不知道。 – 2011-09-19 18:12:09

29

由於幾乎所有的項目都是圖形用戶界面,因此在Cocoa中實現一個非常罕見的事情是在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]; 
} 
+0

Thankyou爲例 – 2010-02-07 21:49:11

+2

NSNEXTSTEPStringEncoding? – Trejkaz 2014-07-21 03:46:25

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 
} 
3

C字符串(UTF8字符串)是一個指向字符串對象內部結構的指針。

NSString *str = @"Hello, World."; 
printf("%s\n", [str UTF8String]); 
0

我只是做:

define NSPrintf(...) printf("%s", [[NSString stringWithFormat: __VA_ARGS__] UTF8String]) 

然後我就可以使用它作爲:

NSPrintf(@"Sorry %@, I can't do that\n", name);