2010-10-01 12 views
9

Zajmuję się tworzeniem biblioteki statycznej, która będzie rozpowszechniana wśród innych programistów, którzy mogą potrzebować instrukcji debugowania. Mam kilka poziomów rejestrowania.Jak uzyskać sformatowany NSString z formatu i va_list?

W celu uniknięcia stały wygląd

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

stworzyłem zestaw owijarki funkcji rejestrowania. Uproszczona wersja wygląda tak:

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

itp

Ale teraz chcę, od wewnątrz myLog, dostęp do w pełni sformatowany ciąg zrobić coś innego z.

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

Odpowiedz

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

Istnieje metoda na to;)

Chociaż nie sugerują, aby korzystać z funkcji, ale kilka prostych definicji makr:

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

Dzięki. Jaki jest powód, dla którego metoda klasy skrótu nie działa? – executor21

+0

W (Objective-) C można przechwycić listę argumentów o zmiennej długości w takiej 'va_list', jednak nigdy nie będziesz w stanie użyć jej ponownie podczas wywoływania innego obiektu. To po prostu nie zadziała, bardzo denerwujące. Używając makra, preprocesor poradzi sobie z nim poprawnie i skompiluje się tak, jakbyś po prostu wpisał 'myLog (1, format, arg1, arg2, arg3) ;, więc to zadziała. Jest jeszcze szybszy, ponieważ nie ma dodatkowego kodu do wykonania w czasie wykonywania. – Joost