2017-04-12 80 views
1

我正在使用的第三方二进制库之一有一个不幸的NSLog声明,我希望在运行时避免它(它泄漏个人信息)。框架开发人员不愿意改变这条线,我没有其他选择(二进制补丁不是一种选择,也不是切换提供商)。覆盖iOS框架符号

是否可以定义我自己的NSLog符号,我可以用它来过滤不需要的日志记录并将其他日志记录调用委托给原始的NSLog?苹果是否会拒绝覆盖核心框架符号的应用程序?

+1

是的,这是可能的,只是使用相同的定义作为系统之一。由于NSLog是一个可变参数函数(接受不同数量的参数),因此您的重写实现中可能需要类似NSLogv之类的东西。该框架是一个dylib还是与您的应用程序二进制文件链接的静态库?重写NSLog只适用于后一种情况。作为最后的手段,你完全可以沉默NSLog http://stackoverflow.com/a/12611692/5329717 –

+0

@ Kamil.S为什么只有一条评论?只需添加更多信息,最好是代码示例,这看起来像一个很好的答案! – Losiowaty

回答

2

是的。您可以将此代码放入任何.m文件中,但我建议使用AppDelegate。

// Objective-C code 
void NSLog(NSString *format, ...) { 

    //You'll probably want some logic here to determine the issuer of NSLog 
    //and silence it(aka return) if necessary 

    va_list args; 
    va_start(args, format); 
    NSLogv(format, args); 
    va_end(args); 
} 

覆盖NSLog只会在框架不是dylib时才起作用。作为最后的手段,你可以完全沉默NSLog通过重定向stderr stackoverflow.com/a/12611692/5329717