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);
}
}
Gracias. ¿Cuál es la razón por la cual el método de clase de acceso directo no funciona? – executor21
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