iOS 与framework文件冲突解决

问题:主题应用失败了。主题代码上线有段时间了,而我也没修过代码,怎么会出问题呢?
分析:
1.主题的应用逻辑:从服务端下载->本地解压->使用。根据测试提供的线索,只有最新的包应用失败。我检查整个逻辑,下载包完整,解压失败。对比主题的代码,和之前一模一样。有点摸不着动脑。
2.只有沿着最近提交的节点,一个一个去查找,先定位出问题出现在哪个节点上。
3.定位出节点,奇怪的是该节点没有代码冲突,也没有修改主题代码。对ZipArchive解压的代码看了又看,与之前正常的ZipArchive比了又比,发现没有任何思路。
4.替换下最新的ZipArchive的试试,引入SSZipArchive。问题暴露了,编译不通过。


编译报错信息

大概猜到了原因, ZipArchive与SSZipArchive冲突了。而根据节点的信息,应该是新引入的framework中引入了SSZipArchive。而framework中的SSZipArchive,在工程中是看不到的。
我猜测是category覆盖引起的,于是我查找了ZipArchive与
SSZipArchive的分类,发现并无冲突。但是.c文件却有很多相似。


zip资源

我有意把zip.c拖入工程,发现项目能正常运行。至于用的是那个.c文件,我想得看XCode的选择了。原因也明确了,原来文件覆盖不止Category,.c文件也会。尝试去掉新引入的framework,发现功能正常。

这里提供一种查看framework中文件的方法:
用反编译工具如IDA,找到framework中的二进制文件,拖入IDA工具,可查看类名


IDA查看framework中的类文件

总结:
1.如果有引入的合作的第三方framework,除提供framework使用的方法外,还要提供下framework引用了哪些第三方。第三方的zip.c文件,在工程中是看不到的。最好还是以私有组件的方式提供,公共的第三方,大家都能使用。
2.OC中文件覆盖,除了category还有.c文件。
3.无论是framework里的类名、方法,还是category的名称和方法,都要加上前缀,防止冲突。
4.另外,对于全局变量,类名相同等冲突,XCode编译会报错;最难受的是category这种覆盖冲突,找都不好找,再加上framework看不到源码,最为致命。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。