覆盖prefix.pch IOS中的NSLOG

时间:2012-07-11 21:44:33

标签: iphone objective-c ios xcode ios5

我读过这篇文章:http://weakreference.wordpress.com/2011/06/22/overriding-nslog-on-ios/

本文的想法是将这两个内容添加到应用程序的prefix.pch文件中,以便您可以覆盖NSLog的行为。

我要添加的两件事是:

#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的重复。

有没有人成功覆盖NSLog?

谢谢!

编辑以回应Rob:

好的,太好了。我们正在取得进步!我就像你问的那样动了东西。这就是我们现在拥有的:

我的自定义记录器:

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错误。

2 个答案:

答案 0 :(得分:5)

听起来您在customLogger文件中定义了.pch。这意味着每个.m文件都包含它,因此项目创建的每个.o文件都包含自己的customLogger副本。这就是您从链接器中获得重复的符号定义错误的原因。

您需要在customLogger中声明.pch,如下所示:

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

创建一个包含定义的customLogger.m文件。

答案 1 :(得分:-1)

试试这段代码。它会覆盖NSLog。在最后的ClassName-Prefix.pch文件中写下以下代码

#ifdef DEBUG
#    define DLog(...) NSLog(__VA_ARGS__)
#else
#   define DLog(...) /* */
#endif

并在ViewController.m文件中,

- (void)viewDidLoad
{
    [super viewDidLoad];
    DLog(@"printing from DLog");

    DLog(@"printing again from DLog");

// Do any additional setup after loading the view, typically from a nib.
}

这将在控制台中打印句子。 如果您遇到困难,请告诉我。