Печать NSString
Каков правильный способ печати NSString в Objective-C? Многие примеры используют NSLog(), но в соответствии с документацией:
NSLog - это функция FoundationKit для печати отчетов об ошибках на консоли.... NSLog работает в основном как: fprintf (stderr, format_string, args...);
Что для меня немного похоже на макрос _TRACE в Win32/С++. Я не хочу печатать на stderr, я хочу печатать на stdout. Есть люди, которые предлагают использовать printf() следующим образом:
printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);
Но это похоже на дополнительный уровень по косвенности, чтобы напечатать NSString, и он не "чувствует", как решение.
Ответы
Ответ 1
Ну, это решение.
Так как printf
является чистой функцией C, он не будет распознавать объекты Objective-C. (Формат файла NSLog отличается от printf.) Поэтому перед форматированием вы должны преобразовать его в строку C.
Кстати, вы можете использовать [str UTF8String]
вместо [str cStringUsingEncoding:NSUTF8StringEncoding]
.
Ответ 2
Извержение материала до stdout
на самом деле довольно редко можно сделать в Cocoa, учитывая, что почти все проекты являются графическими в природе. Существует относительно мало проектов, которые создаются в виде инструментов командной строки или иначе нужно иметь дело с stdout
.
Однако Фонд действительно предоставляет средства для записи в стандартный вывод. В частности, 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];
}
Ответ 3
Вы должны использовать собственный обработчик или написать макрос самостоятельно.
Совет. Когда NSLog распечатывает объект, он использует метод debugDescription
. Вы можете переопределить этот метод для своих пользовательских подклассов NSObject
для печати пользовательского debugInfo в stdout.
Ответ 4
Я думаю, вы найдете их адекватными для своих нужд:
// 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
}
Ответ 5
Строка C (UTF8String) является указателем на структуру внутри строкового объекта.
NSString *str = @"Hello, World.";
printf("%s\n", [str UTF8String]);
Ответ 6
Я просто делаю:
define NSPrintf(...) printf( "%s", [[NSString stringWithFormat: __VA_ARGS__] UTF8String] )
Тогда я могу использовать его как:
NSPrintf( @"Sorry %@, I can't do that\n", name );