2010-10-01 11 views
9

Estoy desarrollando una biblioteca estática que se distribuirá a otros desarrolladores, que pueden necesitar instrucciones de depuración. Entonces tengo varios niveles de registro.¿Cómo obtengo un NSString formateado de formato y va_list?

Con el fin de evitar la aparición constante de

if(loggingLevelCurrentlySet >= loggingLevelWantedForThisInstance){ 
    NSLog(@"log this"); 
} 

he creado un conjunto de envolturas función de registro. Una versión simplificada es el siguiente:

void myLog(int logLevel, NSString *format, va_list args){ 
    if((loggingLevelCurrentlySet >= logLevel)){ 
     NSLogv(format, args); 
    } 
} 

void myLogLevel1(NSString *format, ...){ 
    va_list args; 
    va_start(args, format); 

    myLog(1, format, args); 
    va_end(args); 
} 

void myLogLevel2(NSString *format, ...){ 
    va_list args; 
    va_start(args, format); 

    myLog(2, format, args); 
    va_end(args); 
} 

etc.

Pero ahora, quiero, desde dentro mylog, el acceso a la cadena totalmente formateado a hacer otra cosa con.

void myLog(int logLevel, NSString *format, va_list args){ 
     NSString *fullString = [NSString stringWithFormat:format, args]; //crashes when args is anything but an empty list 
     CFStringRef cfsr = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, format, args); //also crashes 

     //want to use the string here 

     if((loggingLevelCurrentlySet >= logLevel)){ 
      NSLogv(format, args); 
     } 
} 

Respuesta

13
NSString *fullString = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 

hay un método para que;)

Aunque sugiero no utilizar funciones, pero algunas definiciones de macros simples:

#define myLogLevel1(format, ...) myLog(1, format, __VA_ARGS__) 
#define myLogLevel2(format, ...) myLog(2, format, __VA_ARGS__) 
+0

Gracias. ¿Cuál es la razón por la cual el método de clase de acceso directo no funciona? – executor21

+0

En (Objetivo-) C es posible capturar una lista de longitud variable de argumentos en dicha 'va_list', sin embargo, nunca podrá volver a utilizarla mientras llama a otro objeto. Simplemente no funcionará, es muy molesto. Sin embargo, al usar la macro, el preprocesador lo manejará correctamente y se compilará como si acabara de escribir 'myLog (1, format, arg1, arg2, arg3);' para que funcione. Es aún más rápido, ya que no hay código adicional para ejecutarse en tiempo de ejecución. – Joost

Cuestiones relacionadas