One of the two will be used. Which one is undefined.

当我们运行项目,最开始的打印信息有一些诸如下面的东西:
Class AspectsContainer is implemented in both .../ZLDemo.app/Frameworks/Aspects.framework/Aspects (0x10d82cc08) and .../ZLDemo.app/ZLDemo (0x10342bb20) . One of the two will be used. Which one is undefined.
这个报错就是说同一个类在两个地方都有,我们应该清除其中一个,对包体积、性能有提升。

一、为什么会出现这个情况

像上面的打印信息意思是在Frameworks/Aspects.framework/Aspects中和主工程可执行文件ZLDemo中都有AspectsContainer这个类。
我们打开工程中的Products -> show in finder -> 显示包内容后可以看到ZLDemo这个可执行文件,这个是主工程可执行文件;然后打开Frameworks/Aspects.framework可以看到动态库可执行文件Aspects
然后我们就知道了,这个类是在主工程和动态库中都存在了。然后事实是这样吗?

接下来我们在工程中搜索AspectsContainer, 发现这个类一个是在Aspects的pod库中,另外一个是在自己的pod私有库AAA中,也就是说确实是有两份。但打印信息提示的是Aspects库跟主工程中都有实现,与实际不符

......
一阵沉默后,
接下来开始查看自己的私有库AAA,发现它是静态库,静态库中的符号是直接编译进主工程的,这就解释了为什么打印信息提示的是主工程跟Aspects库有相同类。

所以我们根据情况去掉私有库中的那份Aspects
另外一种查找该类使用过的地方:

// cd到工程目录
grep -r AspectsContainer .
相同报错的其它的情况:
1. 如果是系统的类

如果是系统的类在两个系统的动态库里面都有实现导致报的这个错,我们可以检查自己是否可以改为只依赖一个!如果不能改为一个就请忽略,https://developer.apple.com/forums/thread/699878

2. 如果是两个动态库的情况

根据报错的地址会很容易看出是哪两个库,解决办法根据自己情况!


that's all, happy coding!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容