Подтвердить что ты не робот

Печать NSString

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

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

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

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

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

4b9b3361

Ответ 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 );