Печать строки NSString - PullRequest
       14

Печать строки NSString

27 голосов
/ 07 февраля 2010

Как правильно печатать строку NSString в Objective-C? Многие примеры используют NSLog (), но согласно документации:

NSLog - это функция FoundationKit для печати операторов отладки на консоли. ... NSLog работает в основном как: fprintf (stderr, format_string, args ...);

Что для меня немного похоже на макрос _TRACE в Win32 / C ++. Я не хочу печатать на stderr, я хочу печатать на stdout. Есть люди, которые предлагают использовать printf () следующим образом:

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

Но это похоже на дополнительный уровень косвенности для печати NSString, и это не похоже на решение.

Ответы [ 6 ]

29 голосов
/ 07 февраля 2010

Изъять вещи на stdout на самом деле довольно редко в Какао, учитывая, что почти все проекты имеют GUI по своей природе. Существует относительно немного проектов, которые создаются как инструменты командной строки или иным образом должны иметь дело с 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];
}
24 голосов
/ 07 февраля 2010

Ну, это является решением.

Поскольку printf является чистой функцией C, она не распознает объекты Objective-C. (Средство форматирования NSLog отличается от такового в printf.) Поэтому перед форматированием необходимо преобразовать его в строку C.

Кстати, вы можете использовать [str UTF8String] вместо [str cStringUsingEncoding:NSUTF8StringEncoding].

3 голосов
/ 06 октября 2016

C строка (UTF8String) - указатель на структуру внутри строкового объекта.

NSString *str = @"Hello, World.";
printf("%s\n", [str UTF8String]);
3 голосов
/ 07 августа 2013

Я думаю, вы найдете их подходящими для ваших нужд:

// 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 голосов
/ 07 февраля 2010

Вы должны использовать пользовательский обработчик файлов или написать макрос самостоятельно.

Совет: когда NSLog распечатывает объект, он использует метод debugDescription объекта. Вы можете переопределить этот метод для своих пользовательских NSObject подклассов, чтобы напечатать пользовательское debugInfo на стандартный вывод.

0 голосов
/ 30 апреля 2017

Я просто делаю:

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

Тогда я могу использовать его как:

NSPrintf( @"Sorry %@, I can't do that\n", name );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...