美文网首页iOS沉淀
One of the two will be used. Whi

One of the two will be used. Whi

作者: Sweet丶 | 来源:发表于2022-04-10 12:29 被阅读0次

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

    相关文章

      网友评论

        本文标题:One of the two will be used. Whi

        本文链接:https://www.haomeiwen.com/subject/oprvsrtx.html