我们不再需要将框架链接到XCode项目了吗?

时间:2014-07-23 05:48:14

标签: ios xcode

基于这个问题

Why don't iOS framework dependencies need to be explicitly linked to a static library

我阅读了所选答案但仍然不明白所以我做了一个示例项目

Test Project on Github

在测试项目中,我从主项目和静态库(包括Foundation.framework和UIKit)中删除 Link Binary With Libraries 文件导航的所有框架。基本上,两个项目都链接到0框架。

问题是

  • 在静态库中,它包括MapKit / MapKit.h而没有将Mapkit.framework引用到项目中,为什么它仍在工作?
  • 在主项目中,我从项目中删除了UIKit.framework和Foundation.framework,为什么它仍在工作?
  • 由于它现在正在工作,以后会有任何问题吗?

感谢您的评论。

P.S。通过工作,我的意思是我可以在模拟器上运行,我可以存档主项目而不会出现任何错误。

编辑25/07/2014

我尝试使用我正在处理的真实应用,但它是一样的。

  • 我在文件导航中突出显示了Foundation,UIKit,CoreData和另外10个框架,以及所有这些框架。
  • 取消选中“工具”面板中的目标 - >目标会员资格
  • 构建:通过,运行:传递

我的应用的每项功能仍然按预期工作。我不明白。

2 个答案:

答案 0 :(得分:27)

检查项目构建设置。在 LLVM 5.1 - 语言 - 模块下,您应该看到“自动链接框架”选项。在你的情况下,它听起来像是'YES',默认。

在这种情况下,当您引用编译器不知道的类时,它不会产生错误,而是会找出哪个Framework包含该类并将其链接。在您的代码中,它将是MKMapView或触发链接的其他MapKit类之一。

编辑:来自相关的'What's New?' document

  

为代码模块导入的框架启用了自动链接。什么时候   源文件包含来自支持的框架的标头   模块,编译器在目标文件中生成额外信息   在该框架中自动链接。结果是,在大多数情况下   在这种情况下,您不需要指定单独的框架列表   在使用支持的框架API时与目标链接   模块。

另一种看待它的方法是,当框架已经适当构建时,编译器足够聪明,可以将#import变为@import。所有系统框架都是。

答案 1 :(得分:0)

要详细说明@Tommy的答案,支持模块的框架 满足以下两个条件:

Build Settings下> Packaging

  • Define Modules设置为YES
  • Module Map File存在。

因此,如果您确定代码中使用的框架是模块化的,则可以选择不在链接阶段显式添加它,因为只要在项目文件中它就会自动添加,在Apple Clang - Language - Modules下,选项Link Frameworks Automatically设置为YES