Как получить форматированную строку NSString из списка format и va?


Я разрабатываю статическую библиотеку, которая будет распространяться среди других разработчиков, которым могут понадобиться инструкции отладки. Так что у меня есть несколько уровней ведения журнала.

Во избежание постоянного появления

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

Я создал набор оболочек функций ведения журнала. Упрощенная версия выглядит следующим образом:

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

И т. д.

Но теперь, я хочу, изнутри myLog, получить доступ к полностью сформированной строке, чтобы сделать что-то еще.

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

1 ответ:

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

Для этого есть метод ;)

Хотя я предлагаю использовать не функции, а некоторые простые макроопределения:

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