4

私はこの記事を読みました:http ://weakreference.wordpress.com/2011/06/22/overriding-nslog-on-ios/ 。

この記事の目的は、これら2つをアプリのprefix.pchファイルに追加して、NSLogの動作をオーバーライドできるようにすることです。

私が追加している2つのものは次のとおりです。

#define NSLog(...) customLogger(__VA_ARGS__);

void customLogger(NSString *format, ...) {
    va_list argumentList;
    va_start(argumentList, format);
    NSMutableString * message = [[NSMutableString alloc] initWithFormat:format
        arguments:argumentList];

    [message appendString:@"Our Logger!"]; // Our custom Message!
    NSLogv(message, argumentList); // Originally NSLog is a wrapper around NSLogv.
    va_end(argumentList);
    [message release];
}

xCodeは、customLoggerの重複を検出するというエラーmatch-oエラーをスローします。

誰かがNSLogを正常にオーバーライドしましたか?

ありがとう!

ロブに応じて編集:

いいでしょう 私たちは進歩しています!私はあなたが尋ねたように物を動かしました。これが私たちが今持っているものです:

私のカスタムロガー:

void customLogger(NSString *format, ...) {

    va_list args;
    va_start(args, format);
    va_end(args);
    [newLogger log:format withArgs:args];
}

//This is a newLogger Method
+ (void) log:(NSString *)format withArgs:(va_list) args{

    NSArray *occ = [format componentsSeparatedByString:@"%@"];

    NSInteger characterCount = [occ count]; 

    NSArray *stringItems = [format componentsSeparatedByString:@"%@"];

    NSMutableString *tmp = [[NSMutableString alloc] initWithFormat: @"%@",[stringItems objectAtIndex:0]];

    for( int i = 1; i < characterCount; i++ ) {
        NSString *value = va_arg(args, NSString *);
        [tmp appendString:value];
        [tmp appendString:[stringItems objectAtIndex:i]];
    }

    // Need to alter the above and actually do something with the args! 
    [tmp appendString:@"\n"];
    [[newLogger sharedInstance].logBuffer appendString:tmp];

    if ([newLogger sharedInstance].textTarget){
        [[newLogger sharedInstance].textTarget setText:sharedInstance.logBuffer];
    }
}

+ logを呼び出すと、スレッド1でSIBABRTエラーが発生します。

4

2 に答える 2

5

ファイルで定義customLoggerしたようです。.pchつまり、すべての.mファイルに含まれているため.o、プロジェクトが作成するすべてのファイルには、独自の のコピーが含まれていますcustomLogger。そのため、リンカーからシンボル定義の重複エラーが発生します。

次のように で宣言customLoggerするだけです。.pch

void customLogger(NSString *format, ...);

そしてcustomLogger.m、定義を含むファイルを作成します。

于 2012-07-11T21:50:53.120 に答える