views:

41

answers:

1

I'm developing a static library that will be distributed to other developers, who may need debug statements. So I have several levels of logging.

In order to avoid constant appearance of

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

I created a set of logging function wrappers. A simplified version looks like 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);
}

etc.

But now, I want, from within myLog, access to the fully formated string to do something else with.

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  A: 
NSString *fullString = [[[NSString alloc] initWithFormat:format arguments:args] autorelease];

There is a method for that ;)

Although I suggest not to use functions, but some simple macro definitions:

#define myLogLevel1(format, ...) myLog(1, format, __VA_ARGS__)
#define myLogLevel2(format, ...) myLog(2, format, __VA_ARGS__)
JoostK
Thanks. What's the reason why the shortcut class method doesn't work?
executor21
In (Objective-)C it is possible to capture a variable length list of arguments in such a `va_list`, however you'll never be able to use it again while calling another object. It simply won't work, very annoying. By using the macro though, the preprocessor will handle it correctly and it will compile as if you just typed `myLog(1, format, arg1, arg2, arg3);` so that will work. It's even faster, since there is no extra code to be executed at run time.
JoostK