使用嵌入在动态框架中的第三方框架

时间:2016-01-03 12:50:13

标签: ios swift frameworks cocoa-touch

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

现在我有一个测试项目:

我的项目有一个与之相关的动态框架--A.framework。

SET serverout on; DECLARE CURSOR products_cur ( p_category NUMBER) IS SELECT PRODUCT_NAME, LIST_PRICE FROM products WHERE p_category = category_id ORDER BY LIST_PRICE DEC; r_prod_rec products_cur%ROWTYPE; BEGIN OPEN products_cur; LOOP FETCH products_cur into r_prod_rec if (r_prod_rec.LIST_PRICE > avg(select LIST_PRICE from products where category_id = p_category)) THEN dbms_output.put_line(r_prod_rec.PRODUCT_NAME, r_prod_rec.LIST_PRICE); ENDIF; EXIT when products_cur%NOTFOUND; END LOOP: close products_cur; END;

A.framework内嵌了一个框架 - B.framework

在我的主项目中,我想使用来自B.framework

的类

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

import A.framework

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

怎么可能?它是否安全可靠?主项目如何识别B.framework?

主项目直接将B.framework链接到项目的情况怎么样?在这种情况下,我在链接时看到许多“重复的符号错误”

最重要的是,我如何构建A.framework而不在其中嵌入B.framework,而当然使用其类和函数

任何澄清都有助于:)

2 个答案:

答案 0 :(得分:7)

如您所知,链接B.framework会导致重复的符号。这就是为什么A.framework不应该嵌入B.framework。如果任何机会让消费应用程序关心嵌入式框架,那么你绝不能在另一个框架中嵌入框架(实际上,这意味着你真的应该永远不会这样做。)

A.framework打包不正确。如果打包它,则应删除嵌入式框架并链接应用程序层的所有内容。如果其他人打包它,您应该打开它们的问题来纠正此错误。这个问题对动态框架来说并不陌生。这同样是静态框架的问题。链接依赖项的唯一合适时间是在应用程序层。

(如果您控制整个生态系统(例如Apple),则会有例外情况。那么umbrella frameworks之类的内容是可以接受的。但您不是Apple。)

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

例如:

  • 使用框架目标
  • 创建项目
  • 将GMA.framework拖到框架目标(这将导致它链接但不嵌入)
  • 创建应用目标
  • 让应用程序链接GMA.framework和您的测试框架。这样可以正常工作而不会发生冲突,因为只有一个GMA.framework,并且它只嵌入在应用程序中。

答案 1 :(得分:-1)

如果您使用的是多个框架,则可以尝试Cocoa Pods依赖关系管理器,它将帮助您访问多个框架。这也将允许您保留断点,这将有助于您甚至在框架内进行调试,也可以进行更改。