据我所知,ios 动态框架和静态框架的巨大变化是静态在链接时(启动前)静态链接到代码,而动态在启动/运行时链接
现在我有一个测试项目:
我的项目有一个链接到它的动态框架 - A.framework。
导入A.framework
A.framework 内部嵌入了一个框架 - B.framework
在我的主要项目中,我想使用 B.framework 中的类
现在我在主项目中看到了一个简单的导入语句:
import B.framework
它确实有效,我可以使用嵌入在链接 A.framework 中的 B.framework 内部的代码
怎么可能呢?使用起来安全可靠吗?主工程如何识别B.framework?
如果主项目直接将 B.framework 链接到项目呢?在这种情况下,我在链接时看到许多“重复符号错误”
最重要的是,我如何构建 A.framework 而不是在其中嵌入 B.framework,同时使用它的类和函数
任何澄清都会有所帮助:)
最佳答案
正如您所注意到的,链接 B.framework 会导致重复的符号。这就是为什么 A.framework 不应该嵌入 B.framework 的原因。如果消费应用程序有可能关心嵌入式框架(实际上,这意味着您真的不应该这样做),则您绝不能将框架嵌入到另一个框架中。
A.framework 打包错误。如果你打包了,你应该把嵌入式框架去掉,把应用层的东西都链接起来。如果其他人打包了它,您应该向他们提出问题以更正此错误。这个问题对动态框架来说并不陌生。这同样是静态框架的问题。链接依赖关系的唯一合适时机是在应用层。
(如果您控制整个生态系统(例如 Apple),则异常(exception)。然后像 umbrella frameworks 是可以接受的。但您不是 Apple。)
编辑:可以将一个共享框架链接到另一个共享框架,但不能将其嵌入到另一个共享框架中。关键是共享框架的唯一副本需要来自顶级应用程序。由于最后的链接步骤将在加载时发生,因此您不会有重复的符号,因为共享框架只有一个副本。只是不要将子框架嵌入到您的框架中。
例如:
- 使用框架目标创建项目
- 将 GMA.framework 拖到框架目标(这将导致它链接但不嵌入)
- 创建应用目标
- 让应用链接 GMA.framework 和您的测试框架。这将在没有冲突的情况下正常工作,因为只有一个 GMA.framework,并且它只嵌入到应用程序中。
关于ios - 使用嵌入在动态框架中的第三方框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576706/