iOS 框架是头文件和胖静态归档库的集合。 iOS 不支持包含共享库的框架。
胖静态归档库是多架构目标文件的集合,链接器可以根据需要提取目标文件以创建可执行工件。 iOS 可执行文件是自包含的可执行文件(系统库除外,它们是共享对象)。
脂肪档案可以用 lipo 检查。
cd FrameworkA.framework
lipo -info FrameworkA
Architectures in the fat file: FrameworkA are: armv7 armv7s i386 arm64
创建框架时,不使用链接器工具,因为框架(在您的情况下为 FrameworkA 和 FrameworkB)不是可执行工件。依赖框架包含在框架项目中,因为编译器需要头文件来创建框架 A 和 B 目标文件。对 frameworkC 中符号的任何引用仍未解决。
如果您使用“lipo”和“ar”工具检查 FrameworkA 或 FrameworkB 的内容并提取目标文件,然后使用“nm”转储目标文件符号,您会注意到对 FrameworkC 中符号的任何引用仍未解决.
注意:您需要安装 Xcode 命令行工具才能执行此操作。
cd FrameworkA.framework
lipo FrameworkA -thin armv7 -output FrameworkA_armv7.a
ar -t FrameworkA_armv7.a
objectA1.o
objectA2.o
objectA3.o
ar -x FrameworkA_armv7.a objectA1.o
xcrun --sdk iphoneos nm -p objectA1.o
...
00000188 T FrameworkAFunction
U FrameworkCFunction
...
这就是为什么当您创建应用程序时,您需要在项目中包含所有三个框架(A、B 和 C)。当链接器在其中一个 App 目标文件中读取未解析的符号时,它将搜索框架 A 和 B。当符号被解析时,它会从包含该符号的存档中读取整个目标文件。然后,链接器必须解析该对象中任何未解析的依赖符号。如果那些未解析的符号之一在 FrameworkC 中,它将从 FrameworkC 中拉入包含依赖符号的对象
所以回答你的问题:
在链接应用程序时,框架 A、B 和 C 被链接,只有解析所有符号所需的对象从框架复制到应用程序可执行文件中。
是的,复制对象会增加可执行文件的大小,但任何对象都没有多个副本。
FrameworkC 中的资产只被复制一次,当最终的 App bundle 由 xcode 组装时。