我正在开发一个静态库,该库将分发给可能需要调试语句的其他开发人员。因此,我有几个级别的日志记录。

为了避免不断出现

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

最佳答案

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__)

关于iphone - 如何从format和va_list获取格式化的NSString?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3843573/

10-12 01:22