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);
}
}
Dzięki. Jaki jest powód, dla którego metoda klasy skrótu nie działa? – executor21
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