【问题标题】:Override NSLOG in prefix.pch IOS在 prefix.pch IOS 中覆盖 NSLOG
【发布时间】:2012-07-11 14:53:34
【问题描述】:

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

文章的思路是把这两个东西加到你app的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 错误。

【问题讨论】:

    标签: iphone objective-c ios xcode ios5


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好吧,这工作......部分。现在,我将覆盖 NSLOG。这意味着,我要写一行:#define NSLog(...) customLogger(VA_ARGS);,然后在自定义记录器函数中执行:void customLogger(NSString *format, ... ) { va_list 参数; va_start(参数,格式); va_end(args); [newLogger log:format withArgs:args]; ..这会将所有内容传递给 NSLog,并将它们发送到我的 newLogger。 -- 做这些事情给了我一个神秘的崩溃,那就是线程 1 上的 SIGABRT。
    • 您需要在拨打newLogger之后拨打va_end,而不是之前。
    【解决方案2】:

    试试这个代码。它覆盖了 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.
    }
    

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

    【讨论】:

    • 这不会覆盖任何东西,这会创建一个最终使用 NSLog 的新日志系统:(
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多