2010-02-07 37 views
27

Cách chính xác để in một NSString trong Objective-C là gì? Rất nhiều ví dụ sử dụng NSLog(), nhưng theo tài liệu:In ấn NSString

NSLog là một chức năng FoundationKit để in các câu lệnh gỡ lỗi vào bảng điều khiển. ... NSLog hoạt động cơ bản như sau: fprintf (stderr, format_string, args ...);

Điều gì đối với tôi hơi giống với macro _TRACE trong Win32/C++. Tôi không muốn in để stderr, tôi muốn in để stdout. Có những người đề nghị sử dụng printf() như sau:

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

Nhưng điều này có vẻ như một cấp thêm trên gián tiếp để có được công NSString in, và nó không "cảm thấy" giống như các giải pháp.

Trả lời

24

Vâng, đây là là giải pháp.

printf là hàm C thuần túy, nó sẽ không nhận ra các đối tượng Mục tiêu-C. (Trình định dạng của NSLog khác với bản in của printf.) Vì vậy, bạn phải chuyển đổi nó thành chuỗi C trước khi định dạng.

BTW bạn có thể sử dụng [str UTF8String] thay vì [str cStringUsingEncoding:NSUTF8StringEncoding].

+5

Tôi hiểu 'printf' là một hàm C tinh khiết, nhưng tôi thấy nó lạ mà bạn có sử dụng nó để in một NSString, thay vì Core Foundation có một thư viện IO văn bản. –

3

Bạn nên sử dụng trình xử lý tệp tùy chỉnh hoặc tự viết macro.

Mẹo: khi NSLog in ra một đối tượng, nó sử dụng phương thức debugDescription của đối tượng. Bạn có thể ghi đè phương thức này cho các lớp con tùy chỉnh NSObject của bạn để in debugInfo tùy chỉnh thành stdout.

+0

Tuyệt vời! Chắc chắn không biết điều đó. –

29

Việc đưa nội dung vào stdout thực sự là một điều khá hiếm hoi để thực hiện trong Cocoa, vì hầu như tất cả các dự án đều có GUI trong tự nhiên. Có khá ít dự án được xây dựng dưới dạng công cụ dòng lệnh hoặc nếu không cần phải xử lý stdout.

Tuy nhiên, Quỹ cung cấp các phương tiện để viết cho stdout. Cụ thể, NSFileHandlefileHandleWithStandardOutput cung cấp cho bạn một bộ xử lý tệp có thể ghi vào stdout.

Từ đó, việc chuyển đổi NSString thành NSData và ghi nó là một vấn đề.

Khá một vài bước, nhưng dễ dàng gói lên trong một chức năng tái sử dụng:

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 cho ví dụ –

+2

NSNEXTSTEPStringEncoding? – Trejkaz

3

Tôi nghĩ rằng bạn sẽ tìm thấy những đầy đủ cho nhu cầu của bạn:

// 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 string (UTF8String) là một con trỏ đến một cấu trúc bên trong đối tượng chuỗi.

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

Tôi chỉ làm:

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

Sau đó, tôi có thể sử dụng nó như:

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