使用embedded在dynamic框架中的第三方框架

据我所知,从dynamic框架和静态的重大变化是静态链接的时候静态链接到代码(启动之前)和dynamic链接在启动/运行时

现在我有一个testing项目:

我的项目有一个dynamic框架链接到它 – A.框架。

import A.framework

A.框架有一个embedded其中的框架 – B.框架

在我的主要项目中,我想使用B.framework的类

现在我在主项目中看到一个简单的import语句:

 import B.framework 

它实际上工作,我可以使用内嵌在链接的A.framework中的B.framework内的代码

怎么会这样? 这是安全可靠的吗? 主项目如何识别B.框架?

主项目直接将B.框架与项目联系起来的情况如何? 在这种情况下,我会在链接时看到很多“重复的符号错误”

最重要的是,我怎样才能构buildA.framework,而不是在其内embeddedB.framework,而偏离其使用的类和函数

任何澄清将有助于:)

正如你注意到的,链接B.framework会导致重复的符号。 这就是为什么A.framework不应该embeddedB.framework。 如果消费应用程序有可能关心embedded式框架(实际上,这意味着你真的不应该这么做),那么你绝不能在其他框架中embedded框架。

A.框架被错误地打包。 如果你打包了它,你应该删除embedded式框架,并链接应用层的所有东西。 如果有人打包了它,你应该打开一个问题来纠正这个错误。 这个问题对dynamic框架来说并不新鲜。 静态框架也是一个问题。 链接依赖关系的唯一适当时机是在应用程序层。

(如果你控制整个生态系统(例如苹果),那么就有个例外,那么像雨伞框架这样的东西是可以接受的,但是你不是苹果。)

编辑:链接,但不embedded共享框架到另一个共享框架是可以的。 关键是共享框架的唯一副本需要来自顶层应用程序。 由于最后的链接步骤将在加载时发生,因此您将不会有重复的符号,因为共享框架只有一个副本。 只是不要把子框架embedded你的。

例如:

  • 用框架目标创build项目
  • 将GMA.framework拖到框架目标(这会导致链接但不embedded)
  • 创build应用目标
  • 有应用程序链接GMA.framework和您的testing框架。 这将工作正常,没有碰撞,因为只有一个GMA.framework,它只是embedded在应用程序。

如果你正在使用多个框架,你可以尝试Cocoa Pods的依赖pipe理器,它将帮助你访问多个框架。 这也可以让你保持断点,这将帮助你甚至在框架内进行debugging,也可以做改变。