代码之家  ›  专栏  ›  技术社区  ›  executor21

如何从format和va_列表中获取格式化的nsstring?

  •  10
  • executor21  · 技术社区  · 14 年前

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

    为了避免经常出现

    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 回复  |  直到 14 年前
        1
  •  13
  •   Joost    14 年前
    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__)