Sto sviluppando una libreria statica che verrà distribuita ad altri sviluppatori, che potrebbero aver bisogno di istruzioni di debug. Quindi ho diversi livelli di registrazione.Come posso ottenere una NSString formattata dal formato e dalla va_list?
Per evitare costante comparsa di
if(loggingLevelCurrentlySet >= loggingLevelWantedForThisInstance){
NSLog(@"log this");
}
ho creato un insieme di involucri funzione di registrazione. Una versione semplificata è simile al seguente:
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);
}
ecc
Ma ora, voglio, dall'interno mylog, l'accesso alla stringa completamente formattati per fare qualcosa di diverso 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);
}
}
Grazie. Qual è la ragione per cui il metodo della classe scorciatoia non funziona? – executor21
In (Objective-) C è possibile acquisire un elenco di argomenti di lunghezza variabile in tale 'va_list', tuttavia non sarà mai possibile utilizzarlo di nuovo mentre si chiama un altro oggetto. Semplicemente non funzionerà, molto fastidioso. Tuttavia, usando la macro, il preprocessore lo gestirà correttamente e verrà compilato come se si fosse appena digitato 'myLog (1, format, arg1, arg2, arg3);' così funzionerà. È ancora più veloce, dal momento che non vi è alcun codice aggiuntivo da eseguire in fase di esecuzione. – Joost