9

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); 
     } 
} 

risposta

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

C'è un metodo per questo;)

Anche se io suggerisco di non utilizzare le funzioni, ma alcune semplici definizioni di macro:

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

Grazie. Qual è la ragione per cui il metodo della classe scorciatoia non funziona? – executor21

+0

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

Problemi correlati