2010-02-07 12 views
27

¿Cuál es la forma correcta de imprimir un NSString en Objective-C? Muchos ejemplos usan NSLog(), pero de acuerdo con la documentación:Imprimir un NSString

NSLog es una función FoundationKit para imprimir instrucciones de depuración en la consola. ... NSLog funciona básicamente como: fprintf (stderr, format_string, args ...);

Cuál para mí es un poco como la macro _TRACE en Win32/C++. No quiero imprimir en stderr, quiero imprimir en stdout. Hay personas que sugerir el uso de printf() de la siguiente manera:

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

Pero esto parece como un nivel adicional de indirección para hacer el NSString impreso, y no se "siente" como la solución.

Respuesta

24

Bueno, esto es la solución.

Dado que printf es una función C pura, no reconocerá los objetos Objective-C. (El formateador de NSLog es distinto del de printf). Por lo tanto, debe convertirlo en una cadena C antes de formatear.

Por cierto, puede utilizar [str UTF8String] en lugar de [str cStringUsingEncoding:NSUTF8StringEncoding].

+5

entiendo 'printf' es una función de C puro, pero me resulta raro que usted tiene usarlo para imprimir un NSString, en lugar de Core Foundation que tiene una biblioteca de texto IO. –

3

Debe usar el manejador de archivos personalizado o escribir una macro usted mismo.

Consejo: cuando NSLog imprime un objeto, utiliza el método debugDescription del objeto. Puede anular este método para sus subclases NSObject personalizadas para imprimir debugInfo personalizado en stdout.

+0

¡Impresionante! Definitivamente no lo sabía. –

29

Engañar cosas a stdout es en realidad algo bastante raro de hacer en Cocoa, dado que casi todos los proyectos son de naturaleza GUI. Hay relativamente pocos proyectos que se construyen como herramientas de línea de comandos o de lo contrario deben tratar con stdout.

Sin embargo, la Fundación proporciona los medios para escribir en stdout. Específicamente, NSFileHandle tiene fileHandleWithStandardOutput que le proporciona un identificador de archivo que puede escribir en stdout.

A partir de ahí, se trata de convertir el NSString en un NSData y escribirlo.

unos cuantos pasos, pero fácilmente envuelto en una función reutilizable:

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

Gracias por el ejemplo –

+2

NSNEXTSTEPStringEncoding? – Trejkaz

3

creo que encontrará éstos adecuado para sus necesidades:

// 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

cadena de C (UTF8String) es un puntero a una estructura dentro del objeto de cadena.

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

acabo de hacer:

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

entonces puedo utilizarlo como:

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