JSONString重名冲突的问题

遇到一个bug,调用JSONString奔溃了。在其他项目里都是好的,在这个项目就不行了。首先注意到的是字典的类型不是NSDictionary了,而是变成了AG_Dictionary之类的,大意这样。json转换没有用第三方库,公司自己的代码返回明明是NSDictionary,而且在自己的JSONString方法内打断点,也没有执行?突然想到是不是实际运行的不是公司的这个方法,是别的方法和它同名把它覆盖了?

果然,因为用了shareSDK,里面有个json转换的类,有个方法名字就叫JSONString,而且还有objectFromJSONString,所以字典的类才变成了它们自定义的字典子类。

因为要急着发布(企业用户,发得快,不经过APPStore),而本身有另外封装分享的模块,所以索性把shareSDK去掉。

没想到还是奔溃,这回字典名还换了另一个名字,意识到肯定是还有另一个第三方库也有同样的方法名。果然,这次没有找到明确的头文件有声明JSONString,网上查了下应该是腾讯的SDK里的问题。要通过微信分享,就得用腾讯的SDK,这个就逃不掉了,而且这个代码你看不见改的不能改。

头一次这么强烈的意识到命名的问题这么严重,如果他们开发的时候加一个前缀,比如包名的缩写之类的就不会有问题了。想到swift的类戴上了包名前缀果然有意义。

时间紧迫怎么办?
1.既然有两个同名的方法,为什么取了他们的方法而不是我们自己写的?这个应该在类加载自身方法的时候决定的,还是编译时决定的呢?第三发的方法应该都是使用category给NSDictionary加了新方法。这个一时没有找到答案,如果这条路有答案,应该会比较好。有谁知道可以提点下。

2.使用runtime,我在运行一开始就把JSONString方法的执行内容替换成我想要的,管你用了几个包,有多少个重名的方法。
好吧,这样做是可以了,但却有点邪门歪道的感觉。具体就是使用class_addMethod,把NSDictionary的JSONString方法的IMP(实际执行函数的函数指针)改为自己写的一个C函数,在这个函数里写入自己想要的内容。

你可能感兴趣的:(JSONString重名冲突的问题)