据我所知,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,而当然使用其类和函数
任何澄清都有助于:)
答案 0 :(得分:7)
如您所知,链接B.framework会导致重复的符号。这就是为什么A.framework不应该嵌入B.framework。如果任何机会让消费应用程序关心嵌入式框架,那么你绝不能在另一个框架中嵌入框架(实际上,这意味着你真的应该永远不会这样做。)
A.framework打包不正确。如果打包它,则应删除嵌入式框架并链接应用程序层的所有内容。如果其他人打包它,您应该打开它们的问题来纠正此错误。这个问题对动态框架来说并不陌生。这同样是静态框架的问题。链接依赖项的唯一合适时间是在应用程序层。
(如果您控制整个生态系统(例如Apple),则会有例外情况。那么umbrella frameworks之类的内容是可以接受的。但您不是Apple。)
编辑:可以将共享框架链接到另一个共享框架,但不能将其嵌入。关键是共享框架的唯一副本需要来自顶级应用程序。由于最后的链接步骤将在加载时发生,因此您不会有重复的符号,因为共享框架只有一个副本。只是不要将子框架嵌入你的。例如:
答案 1 :(得分:-1)
如果您使用的是多个框架,则可以尝试Cocoa Pods依赖关系管理器,它将帮助您访问多个框架。这也将允许您保留断点,这将有助于您甚至在框架内进行调试,也可以进行更改。