当我们运行项目,最开始的打印信息有一些诸如下面的东西:
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!
网友评论