我读了这篇文章: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 抛出错误 match-o 错误,它找到了 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 错误。
最佳答案
听起来您在 .pch
文件中定义了 customLogger
。这意味着每个 .m
文件都包含它,因此您的项目创建的每个 .o
文件都包含它自己的 customLogger
副本。这就是为什么您会从链接器中收到重复的符号定义错误。
您只需在 .pch
中声明 customLogger
,如下所示:
void customLogger(NSString *format, ...);
并创建一个包含定义的 customLogger.m
文件。
关于iphone - 在 prefix.pch IOS 中覆盖 NSLOG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441962/